home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / role / roleplay.0-s / roleplay / RolePlaying-1.0 / scripts / SYSFunctions < prev    next >
Text File  |  1995-07-09  |  95KB  |  2,655 lines

  1. # Module: SYSFunctions
  2. # Tcl version: 7.3 (Tcl/Tk/XF)
  3. # Tk version: 3.6
  4. # XF version: $__lastrelease$
  5. #
  6.  
  7. # module contents
  8. global moduleList
  9. global autoLoadList
  10. set moduleList(SYSFunctions) { AlertBox AlertBoxFd AlertBoxFile AlertBoxInternal Alias FSBox FSBoxBindSelectOne FSBoxFSFileSelect FSBoxFSFileSelectDouble FSBoxFSInsertPath FSBoxFSNameComplete FSBoxFSShow GetSelection HistoryTextBox InputBoxInternal InputBoxMulti InputBoxOne IsADir IsAFile IsASymlink TextBox TextBoxFd TextBoxFile TextBoxInternal VersionAlertBox YesNoBox Unalias ColorBox}
  11. set autoLoadList(SYSFunctions) {0}
  12.  
  13. # procedures to show toplevel windows
  14.  
  15.  
  16. # User defined procedures
  17.  
  18.  
  19. # Procedure: AlertBox
  20. proc AlertBox { {alertBoxMessage "Alert message"} {alertBoxCommand ""} {alertBoxGeometry "350x150"} {alertBoxTitle "Alert box"} args} {
  21. # xf ignore me 5
  22. ##########
  23. # Procedure: AlertBox
  24. # Description: show alert box
  25. # Arguments: {alertBoxMessage} - the text to display
  26. #            {alertBoxCommand} - the command to call after ok
  27. #            {alertBoxGeometry} - the geometry for the window
  28. #            {alertBoxTitle} - the title for the window
  29. #            {args} - labels of buttons
  30. # Returns: The number of the selected button, ot nothing
  31. # Sideeffects: none
  32. # Notes: there exist also functions called:
  33. #          AlertBoxFile - to open and read a file automatically
  34. #          AlertBoxFd - to read from an already opened filedescriptor
  35. ##########
  36. #
  37. # global alertBox(activeBackground) - active background color
  38. # global alertBox(activeForeground) - active foreground color
  39. # global alertBox(after) - destroy alert box after n seconds
  40. # global alertBox(anchor) - anchor for message box
  41. # global alertBox(background) - background color
  42. # global alertBox(font) - message font
  43. # global alertBox(foreground) - foreground color
  44. # global alertBox(justify) - justify for message box
  45. # global alertBox(toplevelName) - the toplevel name
  46.  
  47.   global alertBox
  48.  
  49.   # show alert box
  50.   if {[llength $args] > 0} {
  51.     eval AlertBoxInternal "\{$alertBoxMessage\}" "\{$alertBoxCommand\}" "\{$alertBoxGeometry\}" "\{$alertBoxTitle\}" $args
  52.   } {
  53.     AlertBoxInternal $alertBoxMessage $alertBoxCommand $alertBoxGeometry $alertBoxTitle
  54.   }
  55.  
  56.   if {[llength $args] > 0} {
  57.     # wait for the box to be destroyed
  58.     update idletask
  59.     grab $alertBox(toplevelName)
  60.     tkwait window $alertBox(toplevelName)
  61.  
  62.     return $alertBox(button)
  63.   }
  64. }
  65.  
  66.  
  67. # Procedure: AlertBoxFd
  68. proc AlertBoxFd { {alertBoxInFile ""} {alertBoxCommand ""} {alertBoxGeometry "350x150"} {alertBoxTitle "Alert box"} args} {
  69. # xf ignore me 5
  70. ##########
  71. # Procedure: AlertBoxFd
  72. # Description: show alert box containing a filedescriptor
  73. # Arguments: {alertBoxInFile} - a filedescriptor to read. The descriptor
  74. #                               is closed after reading
  75. #            {alertBoxCommand} - the command to call after ok
  76. #            {alertBoxGeometry} - the geometry for the window
  77. #            {alertBoxTitle} - the title for the window
  78. #            {args} - labels of buttons
  79. # Returns: The number of the selected button, ot nothing
  80. # Sideeffects: none
  81. # Notes: there exist also functions called:
  82. #          AlertBox - to display a passed string
  83. #          AlertBoxFile - to open and read a file automatically
  84. ##########
  85. #
  86. # global alertBox(activeBackground) - active background color
  87. # global alertBox(activeForeground) - active foreground color
  88. # global alertBox(after) - destroy alert box after n seconds
  89. # global alertBox(anchor) - anchor for message box
  90. # global alertBox(background) - background color
  91. # global alertBox(font) - message font
  92. # global alertBox(foreground) - foreground color
  93. # global alertBox(justify) - justify for message box
  94. # global alertBox(toplevelName) - the toplevel name
  95.  
  96.   global alertBox
  97.  
  98.   # check file existance
  99.   if {"$alertBoxInFile" == ""} {
  100.     puts stderr "No filedescriptor specified"
  101.     return
  102.   }
  103.  
  104.   set alertBoxMessage [read $alertBoxInFile]
  105.   close $alertBoxInFile
  106.  
  107.   # show alert box
  108.   if {[llength $args] > 0} {
  109.     eval AlertBoxInternal "\{$alertBoxMessage\}" "\{$alertBoxCommand\}" "\{$alertBoxGeometry\}" "\{$alertBoxTitle\}" $args
  110.   } {
  111.     AlertBoxInternal $alertBoxMessage $alertBoxCommand $alertBoxGeometry $alertBoxTitle
  112.   }
  113.  
  114.   if {[llength $args] > 0} {
  115.     # wait for the box to be destroyed
  116.     update idletask
  117.     grab $alertBox(toplevelName)
  118.     tkwait window $alertBox(toplevelName)
  119.  
  120.     return $alertBox(button)
  121.   }
  122. }
  123.  
  124.  
  125. # Procedure: AlertBoxFile
  126. proc AlertBoxFile { {alertBoxFile ""} {alertBoxCommand ""} {alertBoxGeometry "350x150"} {alertBoxTitle "Alert box"} args} {
  127. # xf ignore me 5
  128. ##########
  129. # Procedure: AlertBoxFile
  130. # Description: show alert box containing a file
  131. # Arguments: {alertBoxFile} - filename to read
  132. #            {alertBoxCommand} - the command to call after ok
  133. #            {alertBoxGeometry} - the geometry for the window
  134. #            {alertBoxTitle} - the title for the window
  135. #            {args} - labels of buttons
  136. # Returns: The number of the selected button, ot nothing
  137. # Sideeffects: none
  138. # Notes: there exist also functions called:
  139. #          AlertBox - to display a passed string
  140. #          AlertBoxFd - to read from an already opened filedescriptor
  141. ##########
  142. #
  143. # global alertBox(activeBackground) - active background color
  144. # global alertBox(activeForeground) - active foreground color
  145. # global alertBox(after) - destroy alert box after n seconds
  146. # global alertBox(anchor) - anchor for message box
  147. # global alertBox(background) - background color
  148. # global alertBox(font) - message font
  149. # global alertBox(foreground) - foreground color
  150. # global alertBox(justify) - justify for message box
  151. # global alertBox(toplevelName) - the toplevel name
  152.  
  153.   global alertBox
  154.  
  155.   # check file existance
  156.   if {"$alertBoxFile" == ""} {
  157.     puts stderr "No filename specified"
  158.     return
  159.   }
  160.  
  161.   if {[catch "open $alertBoxFile r" alertBoxInFile]} {
  162.     puts stderr "$alertBoxInFile"
  163.     return
  164.   }
  165.  
  166.   set alertBoxMessage [read $alertBoxInFile]
  167.   close $alertBoxInFile
  168.  
  169.   # show alert box
  170.   if {[llength $args] > 0} {
  171.     eval AlertBoxInternal "\{$alertBoxMessage\}" "\{$alertBoxCommand\}" "\{$alertBoxGeometry\}" "\{$alertBoxTitle\}" $args
  172.   } {
  173.     AlertBoxInternal $alertBoxMessage $alertBoxCommand $alertBoxGeometry $alertBoxTitle
  174.   }
  175.  
  176.   if {[llength $args] > 0} {
  177.     # wait for the box to be destroyed
  178.     update idletask
  179.     grab $alertBox(toplevelName)
  180.     tkwait window $alertBox(toplevelName)
  181.  
  182.     return $alertBox(button)
  183.   }
  184. }
  185.  
  186.  
  187. # Procedure: AlertBoxInternal
  188. proc AlertBoxInternal { alertBoxMessage alertBoxCommand alertBoxGeometry alertBoxTitle args} {
  189. # xf ignore me 6
  190.   global alertBox
  191.  
  192.   set tmpButtonOpt ""
  193.   set tmpFrameOpt ""
  194.   set tmpMessageOpt ""
  195.   if {"$alertBox(activeBackground)" != ""} {
  196.     append tmpButtonOpt "-activebackground \"$alertBox(activeBackground)\" "
  197.   }
  198.   if {"$alertBox(activeForeground)" != ""} {
  199.     append tmpButtonOpt "-activeforeground \"$alertBox(activeForeground)\" "
  200.   }
  201.   if {"$alertBox(background)" != ""} {
  202.     append tmpButtonOpt "-background \"$alertBox(background)\" "
  203.     append tmpFrameOpt "-background \"$alertBox(background)\" "
  204.     append tmpMessageOpt "-background \"$alertBox(background)\" "
  205.   }
  206.   if {"$alertBox(font)" != ""} {
  207.     append tmpButtonOpt "-font \"$alertBox(font)\" "
  208.     append tmpMessageOpt "-font \"$alertBox(font)\" "
  209.   }
  210.   if {"$alertBox(foreground)" != ""} {
  211.     append tmpButtonOpt "-foreground \"$alertBox(foreground)\" "
  212.     append tmpMessageOpt "-foreground \"$alertBox(foreground)\" "
  213.   }
  214.  
  215.   # start build of toplevel
  216.   if {"[info commands XFDestroy]" != ""} {
  217.     catch {XFDestroy $alertBox(toplevelName)}
  218.   } {
  219.     catch {destroy $alertBox(toplevelName)}
  220.   }
  221.   toplevel $alertBox(toplevelName)  -borderwidth 0
  222.   catch "$alertBox(toplevelName) config $tmpFrameOpt"
  223.   if {[catch "wm geometry $alertBox(toplevelName) $alertBoxGeometry"]} {
  224.     wm geometry $alertBox(toplevelName) 350x150
  225.   }
  226.   wm title $alertBox(toplevelName) $alertBoxTitle
  227.   wm maxsize $alertBox(toplevelName) 1000 1000
  228.   wm minsize $alertBox(toplevelName) 100 100
  229.   # end build of toplevel
  230.  
  231.   message $alertBox(toplevelName).message1  -anchor "$alertBox(anchor)"  -justify "$alertBox(justify)"  -relief raised  -text "$alertBoxMessage"
  232.   catch "$alertBox(toplevelName).message1 config $tmpMessageOpt"
  233.  
  234.   set xfTmpWidth  [string range $alertBoxGeometry 0 [expr [string first x $alertBoxGeometry]-1]]
  235.   if {"$xfTmpWidth" != ""} {
  236.     # set message size
  237.     catch "$alertBox(toplevelName).message1 configure  -width [expr $xfTmpWidth-10]"
  238.   } {
  239.     $alertBox(toplevelName).message1 configure  -aspect 1500
  240.   }
  241.  
  242.   frame $alertBox(toplevelName).frame1  -borderwidth 0  -relief raised
  243.   catch "$alertBox(toplevelName).frame1 config $tmpFrameOpt"
  244.  
  245.   set alertBoxCounter 0
  246.   set buttonNum [llength $args]
  247.   if {$buttonNum > 0} {
  248.     while {$alertBoxCounter < $buttonNum} {
  249.       button $alertBox(toplevelName).frame1.button$alertBoxCounter  -text "[lindex $args $alertBoxCounter]"  -command "
  250.           global alertBox
  251.           set alertBox(button) $alertBoxCounter
  252.           if {\"\[info commands XFDestroy\]\" != \"\"} {
  253.             catch {XFDestroy $alertBox(toplevelName)}
  254.           } {
  255.             catch {destroy $alertBox(toplevelName)}
  256.           }"
  257.       catch "$alertBox(toplevelName).frame1.button$alertBoxCounter config $tmpButtonOpt"
  258.  
  259.       pack append $alertBox(toplevelName).frame1  $alertBox(toplevelName).frame1.button$alertBoxCounter {left fillx expand}
  260.  
  261.       incr alertBoxCounter
  262.     }
  263.   } {
  264.     button $alertBox(toplevelName).frame1.button0  -text "OK"  -command "
  265.         global alertBox
  266.         set alertBox(button) 0
  267.         if {\"\[info commands XFDestroy\]\" != \"\"} {
  268.           catch {XFDestroy $alertBox(toplevelName)}
  269.         } {
  270.           catch {destroy $alertBox(toplevelName)}
  271.         }
  272.         $alertBoxCommand"
  273.     catch "$alertBox(toplevelName).frame1.button0 config $tmpButtonOpt"
  274.  
  275.     pack append $alertBox(toplevelName).frame1  $alertBox(toplevelName).frame1.button0 {left fillx expand}
  276.   }
  277.  
  278.   # packing
  279.   pack append $alertBox(toplevelName)  $alertBox(toplevelName).frame1 {bottom fill}  $alertBox(toplevelName).message1 {top fill expand}
  280.  
  281.   if {$alertBox(after) != 0} {
  282.     after [expr $alertBox(after)*1000]  "catch \"$alertBox(toplevelName).frame1.button0 invoke\""
  283.   }
  284. }
  285.  
  286.  
  287. # Procedure: FSBox
  288. proc FSBox { {fsBoxMessage "Select file:"} {fsBoxFileName ""} {fsBoxActionOk ""} {fsBoxActionCancel ""}} {
  289. # xf ignore me 5
  290. ##########
  291. # Procedure: FSBox
  292. # Description: show file selector box
  293. # Arguments: fsBoxMessage - the text to display
  294. #            fsBoxFileName - a file name that should be selected
  295. #            fsBoxActionOk - the action that should be performed on ok
  296. #            fsBoxActionCancel - the action that should be performed on cancel
  297. # Returns: the filename that was selected, or nothing
  298. # Sideeffects: none
  299. ##########
  300. # global fsBox(activeBackground) - active background color
  301. # global fsBox(activeForeground) - active foreground color
  302. # global fsBox(background) - background color
  303. # global fsBox(font) - text font
  304. # global fsBox(foreground) - foreground color
  305. # global fsBox(extensions) - scan directory for extensions
  306. # global fsBox(scrollActiveForeground) - scrollbar active background color
  307. # global fsBox(scrollBackground) - scrollbar background color
  308. # global fsBox(scrollForeground) - scrollbar foreground color
  309. # global fsBox(scrollSide) - side where scrollbar is located
  310.  
  311.   global fsBox
  312.  
  313.   set tmpButtonOpt ""
  314.   set tmpFrameOpt ""
  315.   set tmpMessageOpt ""
  316.   set tmpScaleOpt ""
  317.   set tmpScrollOpt ""
  318.   if {"$fsBox(activeBackground)" != ""} {
  319.     append tmpButtonOpt "-activebackground \"$fsBox(activeBackground)\" "
  320.   }
  321.   if {"$fsBox(activeForeground)" != ""} {
  322.     append tmpButtonOpt "-activeforeground \"$fsBox(activeForeground)\" "
  323.   }
  324.   if {"$fsBox(background)" != ""} {
  325.     append tmpButtonOpt "-background \"$fsBox(background)\" "
  326.     append tmpFrameOpt "-background \"$fsBox(background)\" "
  327.     append tmpMessageOpt "-background \"$fsBox(background)\" "
  328.   }
  329.   if {"$fsBox(font)" != ""} {
  330.     append tmpButtonOpt "-font \"$fsBox(font)\" "
  331.     append tmpMessageOpt "-font \"$fsBox(font)\" "
  332.   }
  333.   if {"$fsBox(foreground)" != ""} {
  334.     append tmpButtonOpt "-foreground \"$fsBox(foreground)\" "
  335.     append tmpMessageOpt "-foreground \"$fsBox(foreground)\" "
  336.   }
  337.   if {"$fsBox(scrollActiveForeground)" != ""} {
  338.     append tmpScrollOpt "-activeforeground \"$fsBox(scrollActiveForeground)\" "
  339.   }
  340.   if {"$fsBox(scrollBackground)" != ""} {
  341.     append tmpScrollOpt "-background \"$fsBox(scrollBackground)\" "
  342.   }
  343.   if {"$fsBox(scrollForeground)" != ""} {
  344.     append tmpScrollOpt "-foreground \"$fsBox(scrollForeground)\" "
  345.   }
  346.  
  347.   if {[file exists [file tail $fsBoxFileName]] &&
  348.       [IsAFile [file tail $fsBoxFileName]]} {
  349.     set fsBox(name) [file tail $fsBoxFileName]
  350.   } {
  351.     set fsBox(name) ""
  352.   }
  353.   if {[file exists $fsBoxFileName] && [IsADir $fsBoxFileName]} {
  354.     set fsBox(path) $fsBoxFileName
  355.   } {
  356.     if {"[file rootname $fsBoxFileName]" != "."} {
  357.       set fsBox(path) [file rootname $fsBoxFileName]
  358.     }
  359.   }
  360.   if {$fsBox(showPixmap)} {
  361.     set fsBox(path) [string trimleft $fsBox(path) @]
  362.   }
  363.   if {"$fsBox(path)" != "" && [file exists $fsBox(path)] &&
  364.       [IsADir $fsBox(path)]} {
  365.     set fsBox(internalPath) $fsBox(path)
  366.   } {
  367.     if {"$fsBox(internalPath)" == "" ||
  368.         ![file exists $fsBox(internalPath)]} {
  369.       set fsBox(internalPath) [pwd]
  370.     }
  371.   }
  372.   # build widget structure
  373.  
  374.   # start build of toplevel
  375.   if {"[info commands XFDestroy]" != ""} {
  376.     catch {XFDestroy .fsBox}
  377.   } {
  378.     catch {destroy .fsBox}
  379.   }
  380.   toplevel .fsBox  -borderwidth 0
  381.   catch ".fsBox config $tmpFrameOpt"
  382.   wm geometry .fsBox 350x300 
  383.   wm title .fsBox {File select box}
  384.   wm maxsize .fsBox 1000 1000
  385.   wm minsize .fsBox 100 100
  386.   # end build of toplevel
  387.  
  388.   label .fsBox.message1  -anchor c  -relief raised  -text "$fsBoxMessage"
  389.   catch ".fsBox.message1 config $tmpMessageOpt"
  390.  
  391.   frame .fsBox.frame1  -borderwidth 0  -relief raised
  392.   catch ".fsBox.frame1 config $tmpFrameOpt"
  393.  
  394.   button .fsBox.frame1.ok  -text "OK"  -command "
  395.       global fsBox
  396.       set fsBox(name) \[.fsBox.file.file get\]
  397.       if {$fsBox(showPixmap)} {
  398.         set fsBox(path) @\[.fsBox.path.path get\]
  399.       } {
  400.         set fsBox(path) \[.fsBox.path.path get\]
  401.       }
  402.       set fsBox(internalPath) \[.fsBox.path.path get\]
  403.       $fsBoxActionOk
  404.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  405.         catch {XFDestroy .fsBox}
  406.       } {
  407.         catch {destroy .fsBox}
  408.       }"
  409.   catch ".fsBox.frame1.ok config $tmpButtonOpt"
  410.  
  411.   button .fsBox.frame1.rescan  -text "Rescan"  -command {
  412.       global fsBox
  413.       FSBoxFSShow [.fsBox.path.path get]  [.fsBox.pattern.pattern get] $fsBox(all)}
  414.   catch ".fsBox.frame1.rescan config $tmpButtonOpt"
  415.  
  416.   button .fsBox.frame1.cancel  -text "Cancel"  -command "
  417.       global fsBox
  418.       set fsBox(name) {}
  419.       set fsBox(path) {}
  420.       $fsBoxActionCancel
  421.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  422.         catch {XFDestroy .fsBox}
  423.       } {
  424.         catch {destroy .fsBox}
  425.       }"
  426.   catch ".fsBox.frame1.cancel config $tmpButtonOpt"
  427.  
  428.   if {$fsBox(showPixmap)} {
  429.     frame .fsBox.frame2  -borderwidth 0  -relief raised
  430.     catch ".fsBox.frame2 config $tmpFrameOpt"
  431.  
  432.     scrollbar .fsBox.frame2.scrollbar3  -command {.fsBox.frame2.canvas2 xview}  -orient {horizontal}  -relief {raised}
  433.     catch ".fsBox.frame2.scrollbar3 config $tmpScrollOpt"
  434.  
  435.     scrollbar .fsBox.frame2.scrollbar1  -command {.fsBox.frame2.canvas2 yview}  -relief {raised}
  436.     catch ".fsBox.frame2.scrollbar1 config $tmpScrollOpt"
  437.  
  438.     canvas .fsBox.frame2.canvas2  -confine {true}  -relief {raised}  -scrollregion {0c 0c 20c 20c}  -width {100}  -xscrollcommand {.fsBox.frame2.scrollbar3 set}  -yscrollcommand {.fsBox.frame2.scrollbar1 set}
  439.     catch ".fsBox.frame2.canvas2 config $tmpFrameOpt"
  440.  
  441.     .fsBox.frame2.canvas2 addtag currentBitmap withtag [.fsBox.frame2.canvas2 create bitmap 5 5 -anchor nw]
  442.   }
  443.  
  444.   frame .fsBox.path  -borderwidth 0  -relief raised
  445.   catch ".fsBox.path config $tmpFrameOpt"
  446.  
  447.   frame .fsBox.path.paths  -borderwidth 2  -relief raised
  448.   catch ".fsBox.path.paths config $tmpFrameOpt"
  449.  
  450.   menubutton .fsBox.path.paths.paths  -borderwidth 0  -menu ".fsBox.path.paths.paths.menu"  -relief flat  -text "Pathname:"
  451.   catch ".fsBox.path.paths.paths config $tmpButtonOpt"
  452.  
  453.   menu .fsBox.path.paths.paths.menu
  454.   catch ".fsBox.path.paths.paths.menu config $tmpButtonOpt"
  455.  
  456.   .fsBox.path.paths.paths.menu add command  -label "[string trimright $fsBox(internalPath) {/@}]"  -command "
  457.        global fsBox
  458.        FSBoxFSShow \[.fsBox.path.path get\]  \[.fsBox.pattern.pattern get\] \$fsBox(all)
  459.        .fsBox.path.path delete 0 end
  460.        .fsBox.path.path insert 0 [string trimright $fsBox(internalPath) {/@}]"
  461.  
  462.   entry .fsBox.path.path  -relief raised
  463.   catch ".fsBox.path.path config $tmpMessageOpt"
  464.  
  465.   if {![IsADir $fsBox(internalPath)]} {
  466.     set $fsBox(internalPath) [pwd]
  467.   }
  468.   .fsBox.path.path insert 0 $fsBox(internalPath)
  469.  
  470.   frame .fsBox.pattern  -borderwidth 0  -relief raised
  471.   catch ".fsBox.pattern config $tmpFrameOpt"
  472.  
  473.   frame .fsBox.pattern.patterns  -borderwidth 2  -relief raised
  474.   catch ".fsBox.pattern.patterns config $tmpFrameOpt"
  475.  
  476.   menubutton .fsBox.pattern.patterns.patterns  -borderwidth 0  -menu ".fsBox.pattern.patterns.patterns.menu"  -relief flat  -text "Selection pattern:"
  477.   catch ".fsBox.pattern.patterns.patterns config $tmpButtonOpt"
  478.  
  479.   menu .fsBox.pattern.patterns.patterns.menu
  480.   catch ".fsBox.pattern.patterns.patterns.menu config $tmpButtonOpt"
  481.  
  482.   .fsBox.pattern.patterns.patterns.menu add checkbutton  -label "Scan extensions"  -variable fsBoxExtensions  -command {
  483.       global fsBox
  484.       FSBoxFSShow [.fsBox.path.path get]  [.fsBox.pattern.pattern get] $fsBox(all)}
  485.  
  486.   entry .fsBox.pattern.pattern  -relief raised
  487.   catch ".fsBox.pattern.pattern config $tmpMessageOpt"
  488.  
  489.   .fsBox.pattern.pattern insert 0 $fsBox(pattern)
  490.   
  491.   frame .fsBox.files  -borderwidth 0  -relief raised
  492.   catch ".fsBox.files config $tmpFrameOpt"
  493.  
  494.   scrollbar .fsBox.files.vscroll  -relief raised  -command ".fsBox.files.files yview"
  495.   catch ".fsBox.files.vscroll config $tmpScrollOpt"
  496.  
  497.   scrollbar .fsBox.files.hscroll  -orient horiz  -relief raised  -command ".fsBox.files.files xview"
  498.   catch ".fsBox.files.hscroll config $tmpScrollOpt"
  499.  
  500.   listbox .fsBox.files.files  -exportselection false  -relief raised  -xscrollcommand ".fsBox.files.hscroll set"  -yscrollcommand ".fsBox.files.vscroll set"
  501.   catch ".fsBox.files.files config $tmpMessageOpt"
  502.  
  503.   frame .fsBox.file  -borderwidth 0  -relief raised
  504.   catch ".fsBox.file config $tmpFrameOpt"
  505.  
  506.   label .fsBox.file.labelfile  -relief raised  -text "Filename:"
  507.   catch ".fsBox.file.labelfile config $tmpMessageOpt"
  508.  
  509.   entry .fsBox.file.file  -relief raised
  510.   catch ".fsBox.file.file config $tmpMessageOpt"
  511.  
  512.   .fsBox.file.file delete 0 end
  513.   .fsBox.file.file insert 0 $fsBox(name)
  514.   
  515.   checkbutton .fsBox.pattern.all  -offvalue 0  -onvalue 1  -text "Show all files"  -variable fsBox(all)  -command {
  516.       global fsBox
  517.       FSBoxFSShow [.fsBox.path.path get]  [.fsBox.pattern.pattern get] $fsBox(all)}
  518.   catch ".fsBox.pattern.all config $tmpButtonOpt"
  519.  
  520.   FSBoxFSShow $fsBox(internalPath) $fsBox(pattern) $fsBox(all)
  521.  
  522.   # bindings
  523.   bind .fsBox.files.files <Double-Button-1> "
  524.     FSBoxFSFileSelectDouble %W $fsBox(showPixmap) \{$fsBoxActionOk\} %y"
  525.   bind .fsBox.files.files <ButtonPress-1> "
  526.     FSBoxFSFileSelect %W $fsBox(showPixmap) %y"
  527.   bind .fsBox.files.files <Button1-Motion> "
  528.     FSBoxFSFileSelect %W $fsBox(showPixmap) %y"
  529.   bind .fsBox.files.files <Shift-Button1-Motion> "
  530.     FSBoxFSFileSelect %W $fsBox(showPixmap) %y"
  531.   bind .fsBox.files.files <Shift-ButtonPress-1> "
  532.     FSBoxFSFileSelect %W $fsBox(showPixmap) %y"
  533.  
  534.   bind .fsBox.path.path <Tab> {
  535.     FSBoxFSNameComplete path}
  536.   bind .fsBox.path.path <Return> {
  537.     global tkVersion
  538.     global fsBox
  539.     FSBoxFSShow [.fsBox.path.path get]  [.fsBox.pattern.pattern get] $fsBox(all)
  540.     FSBoxFSInsertPath
  541.     if {$tkVersion >= 3.0} {
  542.       .fsBox.file.file icursor end
  543.     } {
  544.       .fsBox.file.file cursor end
  545.     }
  546.     focus .fsBox.file.file}
  547.   catch "bind .fsBox.path.path <Up> {}"
  548.   bind .fsBox.path.path <Down> {
  549.     global tkVersion
  550.     if {$tkVersion >= 3.0} {
  551.       .fsBox.file.file icursor end
  552.     } {
  553.       .fsBox.file.file cursor end
  554.     }
  555.     focus .fsBox.file.file}
  556.  
  557.   bind .fsBox.file.file <Tab> {
  558.     FSBoxFSNameComplete file}
  559.   bind .fsBox.file.file <Return> "
  560.     global fsBox
  561.     set fsBox(name) \[.fsBox.file.file get\]
  562.     if {$fsBox(showPixmap)} {
  563.       set fsBox(path) @\[.fsBox.path.path get\]
  564.     } {
  565.       set fsBox(path) \[.fsBox.path.path get\]
  566.     }
  567.     set fsBox(internalPath) \[.fsBox.path.path get\]
  568.     $fsBoxActionOk
  569.     if {\"\[info commands XFDestroy\]\" != \"\"} {
  570.       catch {XFDestroy .fsBox}
  571.     } {
  572.       catch {destroy .fsBox}
  573.     }"
  574.   bind .fsBox.file.file <Up> {
  575.     global tkVersion
  576.     if {$tkVersion >= 3.0} {
  577.       .fsBox.path.path icursor end
  578.     } {
  579.       .fsBox.path.path cursor end
  580.     }
  581.     focus .fsBox.path.path}
  582.   bind .fsBox.file.file <Down> {
  583.     global tkVersion
  584.     if {$tkVersion >= 3.0} {
  585.       .fsBox.pattern.pattern icursor end
  586.     } {
  587.       .fsBox.pattern.pattern cursor end
  588.     }
  589.     focus .fsBox.pattern.pattern}
  590.  
  591.   bind .fsBox.pattern.pattern <Return> {
  592.     global fsBox
  593.     FSBoxFSShow [.fsBox.path.path get]  [.fsBox.pattern.pattern get] $fsBox(all)}
  594.   bind .fsBox.pattern.pattern <Up> {
  595.     global tkVersion
  596.     if {$tkVersion >= 3.0} {
  597.       .fsBox.file.file icursor end
  598.     } {
  599.       .fsBox.file.file cursor end
  600.     }
  601.     focus .fsBox.file.file}
  602.   catch "bind .fsBox.pattern.pattern <Down> {}"
  603.  
  604.   # packing
  605.   pack append .fsBox.files  .fsBox.files.vscroll "$fsBox(scrollSide) filly"  .fsBox.files.hscroll {bottom fillx}  .fsBox.files.files {left fill expand}
  606.   pack append .fsBox.file  .fsBox.file.labelfile {left}  .fsBox.file.file {left fill expand}
  607.   pack append .fsBox.frame1  .fsBox.frame1.ok {left fill expand}  .fsBox.frame1.rescan {left fill expand}  .fsBox.frame1.cancel {left fill expand}
  608.   pack append .fsBox.path.paths  .fsBox.path.paths.paths {left}
  609.   pack append .fsBox.pattern.patterns  .fsBox.pattern.patterns.patterns {left}
  610.   pack append .fsBox.path  .fsBox.path.paths {left}  .fsBox.path.path {left fill expand}
  611.   pack append .fsBox.pattern  .fsBox.pattern.patterns {left}  .fsBox.pattern.all {right fill}  .fsBox.pattern.pattern {left fill expand}
  612.   if {$fsBox(showPixmap)} {
  613.     pack append .fsBox.frame2  .fsBox.frame2.scrollbar1 {left filly}  .fsBox.frame2.canvas2 {top expand fill}  .fsBox.frame2.scrollbar3 {top fillx} 
  614.  
  615.     pack append .fsBox  .fsBox.message1 {top fill}  .fsBox.frame1 {bottom fill}  .fsBox.pattern {bottom fill}  .fsBox.file {bottom fill}  .fsBox.path {bottom fill}  .fsBox.frame2 {right fill}  .fsBox.files {left fill expand}
  616.   } {
  617.     pack append .fsBox  .fsBox.message1 {top fill}  .fsBox.frame1 {bottom fill}  .fsBox.pattern {bottom fill}  .fsBox.file {bottom fill}  .fsBox.path {bottom fill}  .fsBox.files {left fill expand}
  618.   }
  619.  
  620.   if {"$fsBoxActionOk" == "" && "$fsBoxActionCancel" == ""} {
  621.     # wait for the box to be destroyed
  622.     update idletask
  623.     grab .fsBox
  624.     tkwait window .fsBox
  625.  
  626.     if {"[string trim $fsBox(path)]" != "" ||
  627.         "[string trim $fsBox(name)]" != ""} {
  628.       if {"[string trimleft [string trim $fsBox(name)] /]" == ""} {
  629.         return [string trimright [string trim $fsBox(path)] /]
  630.       } {
  631.         return [string trimright [string trim $fsBox(path)] /]/[string trimleft [string trim $fsBox(name)] /]
  632.       }
  633.     }
  634.   }
  635. }
  636.  
  637.  
  638. # Procedure: FSBoxBindSelectOne
  639. proc FSBoxBindSelectOne { fsBoxW fsBoxY} {
  640. # xf ignore me 6
  641.  
  642.   set fsBoxNearest [$fsBoxW nearest $fsBoxY]
  643.   if {$fsBoxNearest >= 0} {
  644.     $fsBoxW select from $fsBoxNearest
  645.     $fsBoxW select to $fsBoxNearest
  646.   }
  647. }
  648.  
  649.  
  650. # Procedure: FSBoxFSFileSelect
  651. proc FSBoxFSFileSelect { fsBoxW fsBoxShowPixmap fsBoxY} {
  652. # xf ignore me 6
  653.   global fsBox
  654.  
  655.   FSBoxBindSelectOne $fsBoxW $fsBoxY
  656.   set fsBoxNearest [$fsBoxW nearest $fsBoxY]
  657.   if {$fsBoxNearest >= 0} {
  658.     set fsBoxTmpEntry [$fsBoxW get $fsBoxNearest]
  659.     if {"[string index $fsBoxTmpEntry  [expr [string length $fsBoxTmpEntry]-1]]" == "/" ||
  660.         "[string index $fsBoxTmpEntry  [expr [string length $fsBoxTmpEntry]-1]]" == "@"} {
  661.       set fsBoxFileName [string range $fsBoxTmpEntry 0  [expr [string length $fsBoxTmpEntry]-2]]
  662.       if {![IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]] &&
  663.           ![IsASymlink [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
  664.         set fsBoxFileName $fsBoxTmpEntry
  665.       }
  666.     } {
  667.       if {"[string index $fsBoxTmpEntry  [expr [string length $fsBoxTmpEntry]-1]]" == "*"} {
  668.         set fsBoxFileName [string range $fsBoxTmpEntry 0  [expr [string length $fsBoxTmpEntry]-2]]
  669.         if {![file executable $fsBox(internalPath)/$fsBoxFileName]} {
  670.           set fsBoxFileName $fsBoxTmpEntry
  671.         }
  672.       } {
  673.         set fsBoxFileName $fsBoxTmpEntry
  674.       }
  675.     }
  676.     if {![IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
  677.       set fsBox(name) $fsBoxFileName
  678.       .fsBox.file.file delete 0 end
  679.       .fsBox.file.file insert 0 $fsBox(name)
  680.       if {$fsBoxShowPixmap} {
  681.         catch ".fsBox.frame2.canvas2 itemconfigure currentBitmap -bitmap \"@$fsBox(internalPath)/$fsBox(name)\""
  682.       }
  683.     }
  684.   }
  685. }
  686.  
  687.  
  688. # Procedure: FSBoxFSFileSelectDouble
  689. proc FSBoxFSFileSelectDouble { fsBoxW fsBoxShowPixmap fsBoxAction fsBoxY} {
  690. # xf ignore me 6
  691.   global fsBox
  692.  
  693.   FSBoxBindSelectOne $fsBoxW $fsBoxY
  694.   set fsBoxNearest [$fsBoxW nearest $fsBoxY]
  695.   if {$fsBoxNearest >= 0} {
  696.     set fsBoxTmpEntry [$fsBoxW get $fsBoxNearest]
  697.     if {"$fsBoxTmpEntry" == "../"} {
  698.       set fsBoxTmpEntry [string trimright [string trim $fsBox(internalPath)] "@/"]
  699.       if {"$fsBoxTmpEntry" == ""} {
  700.         return
  701.       }
  702.       FSBoxFSShow [file dirname $fsBoxTmpEntry]  [.fsBox.pattern.pattern get] $fsBox(all)
  703.       .fsBox.path.path delete 0 end
  704.       .fsBox.path.path insert 0 $fsBox(internalPath)
  705.     } {
  706.       if {"[string index $fsBoxTmpEntry  [expr [string length $fsBoxTmpEntry]-1]]" == "/" ||
  707.           "[string index $fsBoxTmpEntry  [expr [string length $fsBoxTmpEntry]-1]]" == "@"} {
  708.         set fsBoxFileName [string range $fsBoxTmpEntry 0  [expr [string length $fsBoxTmpEntry]-2]]
  709.         if {![IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]] &&
  710.             ![IsASymlink [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
  711.           set fsBoxFileName $fsBoxTmpEntry
  712.         }
  713.       } {
  714.         if {"[string index $fsBoxTmpEntry  [expr [string length $fsBoxTmpEntry]-1]]" == "*"} {
  715.           set fsBoxFileName [string range $fsBoxTmpEntry 0  [expr [string length $fsBoxTmpEntry]-2]]
  716.           if {![file executable $fsBox(internalPath)/$fsBoxFileName]} {
  717.             set fsBoxFileName $fsBoxTmpEntry
  718.           }
  719.         } {
  720.           set fsBoxFileName $fsBoxTmpEntry
  721.         }
  722.       }
  723.       if {[IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
  724.         set fsBox(internalPath) "[string trimright $fsBox(internalPath) {/@}]/$fsBoxFileName"
  725.         FSBoxFSShow $fsBox(internalPath)  [.fsBox.pattern.pattern get] $fsBox(all)
  726.         .fsBox.path.path delete 0 end
  727.         .fsBox.path.path insert 0 $fsBox(internalPath)
  728.       } {
  729.         set fsBox(name) $fsBoxFileName
  730.         if {$fsBoxShowPixmap} {
  731.           set fsBox(path) @$fsBox(internalPath)
  732.         } {
  733.           set fsBox(path) $fsBox(internalPath)
  734.         }
  735.         if {"$fsBoxAction" != ""} {
  736.           eval "global fsBox; $fsBoxAction"
  737.         }
  738.         if {"[info commands XFDestroy]" != ""} {
  739.           catch {XFDestroy .fsBox}
  740.         } {
  741.           catch {destroy .fsBox}
  742.         }
  743.       }
  744.     }
  745.   }
  746. }
  747.  
  748.  
  749. # Procedure: FSBoxFSInsertPath
  750. proc FSBoxFSInsertPath {} {
  751. # xf ignore me 6
  752.   global fsBox
  753.  
  754.   set fsBoxLast [.fsBox.path.paths.paths.menu index last]
  755.   set fsBoxNewEntry [string trimright [.fsBox.path.path get] "/@"]
  756.   for {set fsBoxCounter 0} {$fsBoxCounter <= $fsBoxLast} {incr fsBoxCounter 1} {
  757.     if {"$fsBoxNewEntry" ==  "[lindex [.fsBox.path.paths.paths.menu entryconfigure  $fsBoxCounter -label] 4]"} {
  758.       return
  759.     }
  760.   }
  761.   if {$fsBoxLast < 9} {
  762.     .fsBox.path.paths.paths.menu add command  -label "$fsBoxNewEntry"  -command "
  763.         global fsBox
  764.         FSBoxFSShow $fsBoxNewEntry  \[.fsBox.pattern.pattern get\] \$fsBox(all)
  765.         .fsBox.path.path delete 0 end
  766.         .fsBox.path.path insert 0 $fsBoxNewEntry"
  767.   } {
  768.     for {set fsBoxCounter 0} {$fsBoxCounter < $fsBoxLast} {incr fsBoxCounter 1} {
  769.       .fsBox.path.paths.paths.menu entryconfigure  $fsBoxCounter -label  [lindex [.fsBox.path.paths.paths.menu entryconfigure  [expr $fsBoxCounter+1] -label] 4]
  770.       .fsBox.path.paths.paths.menu entryconfigure $fsBoxCounter  -command "
  771.           global fsBox
  772.           FSBoxFSShow [lindex [.fsBox.path.paths.paths.menu entryconfigure  [expr $fsBoxCounter+1] -label] 4]  \[.fsBox.pattern.pattern get\] \$fsBox(all)
  773.           .fsBox.path.path delete 0 end
  774.           .fsBox.path.path insert 0 [lindex  [.fsBox.path.paths.paths.menu entryconfigure  [expr $fsBoxCounter+1] -label] 4]"
  775.     }
  776.     .fsBox.path.paths.paths.menu entryconfigure $fsBoxLast  -label "$fsBoxNewEntry"
  777.     .fsBox.path.paths.paths.menu entryconfigure $fsBoxCounter  -command "
  778.         global fsBox
  779.         FSBoxFSShow \[.fsBox.path.path get\]  \[.fsBox.pattern.pattern get\] \$fsBox(all)
  780.         .fsBox.path.path delete 0 end
  781.         .fsBox.path.path insert 0 $fsBoxNewEntry"
  782.   }
  783. }
  784.  
  785.  
  786. # Procedure: FSBoxFSNameComplete
  787. proc FSBoxFSNameComplete { fsBoxType} {
  788. # xf ignore me 6
  789.   global tkVersion
  790.   global fsBox
  791.  
  792.   set fsBoxNewFile ""
  793.   if {"$fsBoxType" == "path"} {
  794.     set fsBoxDirName [file dirname [.fsBox.path.path get]]
  795.     set fsBoxFileName [file tail [.fsBox.path.path get]]
  796.   } {
  797.     set fsBoxDirName [file dirname [.fsBox.path.path get]/]
  798.     set fsBoxFileName [file tail [.fsBox.file.file get]]
  799.   }
  800.  
  801.   set fsBoxNewFile ""
  802.   if {[IsADir [string trimright $fsBoxDirName @]]} {
  803.     catch "glob -nocomplain $fsBoxDirName/${fsBoxFileName}*" fsBoxResult
  804.     foreach fsBoxCounter $fsBoxResult {
  805.       if {"$fsBoxNewFile" == ""} {
  806.         set fsBoxNewFile [file tail $fsBoxCounter]
  807.       } {
  808.         if {"[string index [file tail $fsBoxCounter] 0]" !=
  809.             "[string index $fsBoxNewFile 0]"} {
  810.           set fsBoxNewFile ""
  811.           break
  812.         }
  813.         set fsBoxCounter1 0
  814.         set fsBoxTmpFile1 $fsBoxNewFile
  815.         set fsBoxTmpFile2 [file tail $fsBoxCounter]
  816.         set fsBoxLength1 [string length $fsBoxTmpFile1]
  817.         set fsBoxLength2 [string length $fsBoxTmpFile2]
  818.         set fsBoxNewFile ""
  819.         if {$fsBoxLength1 > $fsBoxLength2} {
  820.           set fsBoxLength1 $fsBoxLength2
  821.         }
  822.         while {$fsBoxCounter1 < $fsBoxLength1} {
  823.           if {"[string index $fsBoxTmpFile1 $fsBoxCounter1]" ==  "[string index $fsBoxTmpFile2 $fsBoxCounter1]"} {
  824.             append fsBoxNewFile [string index $fsBoxTmpFile1 $fsBoxCounter1]
  825.           } {
  826.             break
  827.           }
  828.           incr fsBoxCounter1 1
  829.         }
  830.       }
  831.     }
  832.   }
  833.   if {"$fsBoxNewFile" != ""} {
  834.     if {[IsADir [string trimright $fsBoxDirName/$fsBoxNewFile @]] ||
  835.         ![IsAFile [string trimright $fsBoxDirName/$fsBoxNewFile @]]} {
  836.       if {[IsADir [string trimright $fsBoxDirName/$fsBoxNewFile @]]} {
  837.         if {"$fsBoxDirName" == "/"} {
  838.           .fsBox.path.path delete 0 end
  839.           .fsBox.path.path insert 0 "/[string trimright [string trim $fsBoxNewFile /] @]/"
  840.         } {
  841.           .fsBox.path.path delete 0 end
  842.           .fsBox.path.path insert 0 "[string trimright $fsBoxDirName /]/[string trimright [string trim $fsBoxNewFile /] @]/"
  843.         }
  844.         FSBoxFSShow [.fsBox.path.path get]  [.fsBox.pattern.pattern get] $fsBox(all)
  845.         FSBoxFSInsertPath
  846.       } {
  847.         .fsBox.path.path delete 0 end
  848.         .fsBox.path.path insert 0 "[string trimright $fsBoxDirName /]/[string trimright [string trim $fsBoxNewFile /] @]"
  849.       }
  850.     } {
  851.       .fsBox.path.path delete 0 end
  852.       .fsBox.path.path insert 0 "[string trimright $fsBoxDirName {@/}]/"
  853.       .fsBox.file.file delete 0 end
  854.       .fsBox.file.file insert 0 $fsBoxNewFile
  855.       if {$tkVersion >= 3.0} {
  856.         .fsBox.file.file icursor end
  857.       } {
  858.         .fsBox.file.file cursor end
  859.       }
  860.       focus .fsBox.file.file
  861.     }
  862.   }
  863. }
  864.  
  865.  
  866. # Procedure: FSBoxFSShow
  867. proc FSBoxFSShow { fsBoxPath fsBoxPattern fsBoxAll} {
  868. # xf ignore me 6
  869.   global fsBox
  870.  
  871.   set tmpButtonOpt ""
  872.   if {"$fsBox(activeBackground)" != ""} {
  873.     append tmpButtonOpt "-activebackground \"$fsBox(activeBackground)\" "
  874.   }
  875.   if {"$fsBox(activeForeground)" != ""} {
  876.     append tmpButtonOpt "-activeforeground \"$fsBox(activeForeground)\" "
  877.   }
  878.   if {"$fsBox(background)" != ""} {
  879.     append tmpButtonOpt "-background \"$fsBox(background)\" "
  880.   }
  881.   if {"$fsBox(font)" != ""} {
  882.     append tmpButtonOpt "-font \"$fsBox(font)\" "
  883.   }
  884.   if {"$fsBox(foreground)" != ""} {
  885.     append tmpButtonOpt "-foreground \"$fsBox(foreground)\" "
  886.   }
  887.  
  888.   set fsBox(pattern) $fsBoxPattern
  889.   if {[file exists $fsBoxPath] && [file readable $fsBoxPath] &&
  890.       [IsADir $fsBoxPath]} {
  891.     set fsBox(internalPath) $fsBoxPath
  892.   } {
  893.     if {[file exists $fsBoxPath] && [file readable $fsBoxPath] &&
  894.         [IsAFile $fsBoxPath]} {
  895.       set fsBox(internalPath) [file dirname $fsBoxPath]
  896.       .fsBox.file.file delete 0 end
  897.       .fsBox.file.file insert 0 [file tail $fsBoxPath]
  898.       set fsBoxPath $fsBox(internalPath)
  899.     } {
  900.       while {"$fsBoxPath" != "" && "$fsBoxPath" != "/" &&
  901.              ![file isdirectory $fsBoxPath]} {
  902.         set fsBox(internalPath) [file dirname $fsBoxPath]
  903.          set fsBoxPath $fsBox(internalPath)
  904.       }
  905.     }
  906.   }
  907.   if {"$fsBoxPath" == ""} {
  908.     set fsBoxPath "/"
  909.     set fsBox(internalPath) "/"
  910.   }
  911.   .fsBox.path.path delete 0 end
  912.   .fsBox.path.path insert 0 $fsBox(internalPath)
  913.  
  914.   if {[.fsBox.files.files size] > 0} {
  915.     .fsBox.files.files delete 0 end
  916.   }
  917.   if {$fsBoxAll} {
  918.     if {[catch "exec ls -F -a $fsBoxPath" fsBoxResult]} {
  919.       puts stderr "$fsBoxResult"
  920.     }
  921.   } {
  922.     if {[catch "exec ls -F $fsBoxPath" fsBoxResult]} {
  923.       puts stderr "$fsBoxResult"
  924.     }
  925.   }
  926.   set fsBoxElementList [lsort $fsBoxResult]
  927.  
  928.   foreach fsBoxCounter [winfo children .fsBox.pattern.patterns.patterns] {
  929.     if {[string length [info commands XFDestroy]] > 0} {
  930.       catch {XFDestroy $fsBoxCounter}
  931.     } {
  932.       catch {destroy $fsBoxCounter}
  933.     }
  934.   }
  935.   menu .fsBox.pattern.patterns.patterns.menu
  936.   catch ".fsBox.pattern.patterns.patterns.menu config $tmpButtonOpt"
  937.  
  938.   if {$fsBox(extensions)} {
  939.     .fsBox.pattern.patterns.patterns.menu add command  -label "*"  -command {
  940.         global fsBox
  941.         set fsBox(pattern) "*"
  942.         .fsBox.pattern.pattern delete 0 end
  943.         .fsBox.pattern.pattern insert 0 $fsBox(pattern)
  944.         FSBoxFSShow [.fsBox.path.path get] $fsBox(pattern)  $fsBox(all)}
  945.   }
  946.  
  947.   if {"$fsBoxPath" != "/"} {
  948.     .fsBox.files.files insert end "../"
  949.   }
  950.   foreach fsBoxCounter $fsBoxElementList {
  951.     if {[string match $fsBoxPattern $fsBoxCounter] ||
  952.         [IsADir [string trimright $fsBoxPath/$fsBoxCounter "/@"]]} {
  953.       if {"$fsBoxCounter" != "../" &&
  954.           "$fsBoxCounter" != "./"} {
  955.         .fsBox.files.files insert end $fsBoxCounter
  956.       }
  957.     }
  958.  
  959.     if {$fsBox(extensions)} {
  960.       catch "file rootname $fsBoxCounter" fsBoxRootName
  961.       catch "file extension $fsBoxCounter" fsBoxExtension
  962.       set fsBoxExtension [string trimright $fsBoxExtension "/*@"]
  963.       if {"$fsBoxExtension" != "" && "$fsBoxRootName" != ""} {
  964.         set fsBoxInsert 1
  965.         set fsBoxLast [.fsBox.pattern.patterns.patterns.menu index last]
  966.         for {set fsBoxCounter1 0} {$fsBoxCounter1 <= $fsBoxLast} {incr fsBoxCounter1 1} {
  967.           if {"*$fsBoxExtension" ==  "[lindex [.fsBox.pattern.patterns.patterns.menu entryconfigure  $fsBoxCounter1 -label] 4]"} {
  968.             set fsBoxInsert 0
  969.           }
  970.         }
  971.     if {$fsBoxInsert} {
  972.           .fsBox.pattern.patterns.patterns.menu add command  -label "*$fsBoxExtension"  -command "
  973.               global fsBox
  974.               set fsBox(pattern) \"*$fsBoxExtension\"
  975.               .fsBox.pattern.pattern delete 0 end
  976.               .fsBox.pattern.pattern insert 0 \$fsBox(pattern)
  977.               FSBoxFSShow \[.fsBox.path.path get\] \$fsBox(pattern)  \$fsBox(all)"
  978.         }
  979.       }
  980.     }
  981.   }
  982.   if {$fsBox(extensions)} {
  983.     .fsBox.pattern.patterns.patterns.menu add separator
  984.   }
  985.   if {$fsBox(extensions) || 
  986.       "[.fsBox.pattern.patterns.patterns.menu index last]" == "none"} {
  987.     .fsBox.pattern.patterns.patterns.menu add checkbutton  -label "Scan extensions"  -variable "fsBox(extensions)"  -command {
  988.         global fsBox
  989.         FSBoxFSShow [.fsBox.path.path get]  [.fsBox.pattern.pattern get] $fsBox(all)}
  990.   }
  991. }
  992.  
  993.  
  994. # Procedure: HistoryTextBox
  995. proc HistoryTextBox {} {
  996.   global ModificationHistory
  997.   TextBox [format "Role Playing DataBase system Modification history\n%s"  $ModificationHistory] "" 600x300 "History Box"
  998. }
  999.  
  1000.  
  1001. # Procedure: InputBoxInternal
  1002. proc InputBoxInternal { inputBoxMessage inputBoxCommandOk inputBoxCommandCancel inputBoxGeometry inputBoxTitle lineNum} {
  1003. # xf ignore me 6
  1004.   global inputBox
  1005.  
  1006.   set tmpButtonOpt ""
  1007.   set tmpFrameOpt ""
  1008.   set tmpMessageOpt ""
  1009.   set tmpScaleOpt ""
  1010.   set tmpScrollOpt ""
  1011.   if {"$inputBox(activeBackground)" != ""} {
  1012.     append tmpButtonOpt "-activebackground \"$inputBox(activeBackground)\" "
  1013.   }
  1014.   if {"$inputBox(activeForeground)" != ""} {
  1015.     append tmpButtonOpt "-activeforeground \"$inputBox(activeForeground)\" "
  1016.   }
  1017.   if {"$inputBox(background)" != ""} {
  1018.     append tmpButtonOpt "-background \"$inputBox(background)\" "
  1019.     append tmpFrameOpt "-background \"$inputBox(background)\" "
  1020.     append tmpMessageOpt "-background \"$inputBox(background)\" "
  1021.   }
  1022.   if {"$inputBox(font)" != ""} {
  1023.     append tmpButtonOpt "-font \"$inputBox(font)\" "
  1024.     append tmpMessageOpt "-font \"$inputBox(font)\" "
  1025.   }
  1026.   if {"$inputBox(foreground)" != ""} {
  1027.     append tmpButtonOpt "-foreground \"$inputBox(foreground)\" "
  1028.     append tmpMessageOpt "-foreground \"$inputBox(foreground)\" "
  1029.   }
  1030.   if {"$inputBox(scrollActiveForeground)" != ""} {
  1031.     append tmpScrollOpt "-activeforeground \"$inputBox(scrollActiveForeground)\" "
  1032.   }
  1033.   if {"$inputBox(scrollBackground)" != ""} {
  1034.     append tmpScrollOpt "-background \"$inputBox(scrollBackground)\" "
  1035.   }
  1036.   if {"$inputBox(scrollForeground)" != ""} {
  1037.     append tmpScrollOpt "-foreground \"$inputBox(scrollForeground)\" "
  1038.   }
  1039.  
  1040.   # start build of toplevel
  1041.   if {"[info commands XFDestroy]" != ""} {
  1042.     catch {XFDestroy $inputBox(toplevelName)}
  1043.   } {
  1044.     catch {destroy $inputBox(toplevelName)}
  1045.   }
  1046.   toplevel $inputBox(toplevelName)  -borderwidth 0
  1047.   catch "$inputBox(toplevelName) config $tmpFrameOpt"
  1048.   if {[catch "wm geometry $inputBox(toplevelName) $inputBoxGeometry"]} {
  1049.     wm geometry $inputBox(toplevelName) 350x150
  1050.   }
  1051.   wm title $inputBox(toplevelName) $inputBoxTitle
  1052.   wm maxsize $inputBox(toplevelName) 1000 1000
  1053.   wm minsize $inputBox(toplevelName) 100 100
  1054.   # end build of toplevel
  1055.  
  1056.   message $inputBox(toplevelName).message1  -anchor "$inputBox(anchor)"  -justify "$inputBox(justify)"  -relief raised  -text "$inputBoxMessage"
  1057.   catch "$inputBox(toplevelName).message1 config $tmpMessageOpt"
  1058.  
  1059.   set xfTmpWidth  [string range $inputBoxGeometry 0 [expr [string first x $inputBoxGeometry]-1]]
  1060.   if {"$xfTmpWidth" != ""} {
  1061.     # set message size
  1062.     catch "$inputBox(toplevelName).message1 configure  -width [expr $xfTmpWidth-10]"
  1063.   } {
  1064.     $inputBox(toplevelName).message1 configure  -aspect 1500
  1065.   }
  1066.  
  1067.   frame $inputBox(toplevelName).frame0  -borderwidth 0  -relief raised
  1068.   catch "$inputBox(toplevelName).frame0 config $tmpFrameOpt"
  1069.  
  1070.   frame $inputBox(toplevelName).frame1  -borderwidth 0  -relief raised
  1071.   catch "$inputBox(toplevelName).frame1 config $tmpFrameOpt"
  1072.  
  1073.   if {$lineNum == 1} {
  1074.     scrollbar $inputBox(toplevelName).frame1.hscroll  -orient "horizontal"  -relief raised  -command "$inputBox(toplevelName).frame1.input view"
  1075.     catch "$inputBox(toplevelName).frame1.hscroll config $tmpScrollOpt"
  1076.  
  1077.     entry $inputBox(toplevelName).frame1.input  -relief raised  -scrollcommand "$inputBox(toplevelName).frame1.hscroll set"
  1078.     catch "$inputBox(toplevelName).frame1.input config $tmpMessageOpt"
  1079.  
  1080.     $inputBox(toplevelName).frame1.input insert 0  $inputBox($inputBox(toplevelName),inputOne)
  1081.     
  1082.     # bindings
  1083.     bind $inputBox(toplevelName).frame1.input <Return> "
  1084.       global inputBox
  1085.       set inputBox($inputBox(toplevelName),inputOne) \[$inputBox(toplevelName).frame1.input get\]
  1086.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  1087.         catch {XFDestroy $inputBox(toplevelName)}
  1088.       } {
  1089.         catch {destroy $inputBox(toplevelName)}
  1090.       }
  1091.       $inputBoxCommandOk"
  1092.     
  1093.     # packing
  1094.     pack append $inputBox(toplevelName).frame1  $inputBox(toplevelName).frame1.hscroll {bottom fill}  $inputBox(toplevelName).frame1.input {top fill expand}
  1095.   } {
  1096.     text $inputBox(toplevelName).frame1.input  -relief raised  -wrap none  -borderwidth 2  -yscrollcommand "$inputBox(toplevelName).frame1.vscroll set"
  1097.     catch "$inputBox(toplevelName).frame1.input config $tmpMessageOpt"
  1098.  
  1099.     scrollbar $inputBox(toplevelName).frame1.vscroll  -relief raised  -command "$inputBox(toplevelName).frame1.input yview"
  1100.     catch "$inputBox(toplevelName).frame1.vscroll config $tmpScrollOpt"
  1101.  
  1102.     $inputBox(toplevelName).frame1.input insert 1.0  $inputBox($inputBox(toplevelName),inputMulti)
  1103.  
  1104.     # bindings
  1105.     bind $inputBox(toplevelName).frame1.input <Control-Return> "
  1106.       global inputBox
  1107.       set inputBox($inputBox(toplevelName),inputMulti) \[$inputBox(toplevelName).frame1.input get 1.0 end\]
  1108.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  1109.         catch {XFDestroy $inputBox(toplevelName)}
  1110.       } {
  1111.         catch {destroy $inputBox(toplevelName)}
  1112.       }
  1113.       $inputBoxCommandOk"
  1114.     bind $inputBox(toplevelName).frame1.input <Meta-Return> "
  1115.       global inputBox
  1116.       set inputBox($inputBox(toplevelName),inputMulti) \[$inputBox(toplevelName).frame1.input get 1.0 end\]
  1117.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  1118.         catch {XFDestroy $inputBox(toplevelName)}
  1119.       } {
  1120.         catch {destroy $inputBox(toplevelName)}
  1121.       }
  1122.       $inputBoxCommandOk"
  1123.  
  1124.     # packing
  1125.     pack append $inputBox(toplevelName).frame1  $inputBox(toplevelName).frame1.vscroll "$inputBox(scrollSide) filly"  $inputBox(toplevelName).frame1.input {left fill expand}
  1126.   }
  1127.   
  1128.   button $inputBox(toplevelName).frame0.button0  -text "OK"  -command "
  1129.       global inputBox
  1130.       if {$lineNum == 1} {
  1131.         set inputBox($inputBox(toplevelName),inputOne) \[$inputBox(toplevelName).frame1.input get\]
  1132.       } {
  1133.         set inputBox($inputBox(toplevelName),inputMulti) \[$inputBox(toplevelName).frame1.input get 1.0 end\]
  1134.       }
  1135.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  1136.         catch {XFDestroy $inputBox(toplevelName)}
  1137.       } {
  1138.         catch {destroy $inputBox(toplevelName)}
  1139.       }
  1140.       $inputBoxCommandOk"
  1141.   catch "$inputBox(toplevelName).frame0.button0 config $tmpButtonOpt"
  1142.  
  1143.   button $inputBox(toplevelName).frame0.button1  -text "Cancel"  -command "
  1144.       global inputBox
  1145.       if {$lineNum == 1} {
  1146.         set inputBox($inputBox(toplevelName),inputOne) \"\"
  1147.       } {
  1148.         set inputBox($inputBox(toplevelName),inputMulti) \"\"
  1149.       }
  1150.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  1151.         catch {XFDestroy $inputBox(toplevelName)}
  1152.       } {
  1153.         catch {destroy $inputBox(toplevelName)}
  1154.       }
  1155.       $inputBoxCommandCancel"
  1156.   catch "$inputBox(toplevelName).frame0.button1 config $tmpButtonOpt"
  1157.  
  1158.   pack append $inputBox(toplevelName).frame0  $inputBox(toplevelName).frame0.button0 {left fill expand}  $inputBox(toplevelName).frame0.button1 {left fill expand}
  1159.  
  1160.   pack append $inputBox(toplevelName)  $inputBox(toplevelName).frame0 {bottom fill}  $inputBox(toplevelName).frame1 {bottom fill expand}  $inputBox(toplevelName).message1 {top fill}
  1161. }
  1162.  
  1163.  
  1164. # Procedure: InputBoxMulti
  1165. proc InputBoxMulti { {inputBoxMessage "Input box:"} {inputBoxCommandOk ""} {inputBoxCommandCancel ""} {inputBoxGeometry "350x150"} {inputBoxTitle "Input box"}} {
  1166. # xf ignore me 5
  1167. ##########
  1168. # Procedure: InputBoxMulti
  1169. # Description: show input box with one text line
  1170. # Arguments: {inputBoxMessage} - message to display
  1171. #            {inputBoxCommandOk} - the command to call after ok
  1172. #            {inputBoxCommandCancel} - the command to call after cancel
  1173. #            {inputBoxGeometry} - the geometry for the window
  1174. #            {inputBoxTitle} - the title for the window
  1175. # Returns: The entered text
  1176. # Sideeffects: none
  1177. # Notes: there exist also a function called:
  1178. #          InputBoxOne - to enter one line text
  1179. ##########
  1180. #
  1181. # global inputBox(activeBackground) - active background color
  1182. # global inputBox(activeForeground) - active foreground color
  1183. # global inputBox(anchor) - anchor for message box
  1184. # global inputBox(background) - background color
  1185. # global inputBox(erase) - erase previous text
  1186. # global inputBox(font) - message font
  1187. # global inputBox(foreground) - foreground color
  1188. # global inputBox(justify) - justify for message box
  1189. # global inputBox(scrollActiveForeground) - scrollbar active background color
  1190. # global inputBox(scrollBackground) - scrollbar background color
  1191. # global inputBox(scrollForeground) - scrollbar foreground color
  1192. # global inputBox(scrollSide) - side where scrollbar is located
  1193. # global inputBox(toplevelName) - the toplevel name
  1194. # global inputBox(toplevelName,inputMulti) - the text in the text widget
  1195.  
  1196.   global inputBox
  1197.  
  1198.   if {"$inputBoxGeometry" == ""} {
  1199.     set inputBoxGeometry 350x150
  1200.   }
  1201.   if {$inputBox(erase)} {
  1202.     set inputBox($inputBox(toplevelName),inputMulti) ""
  1203.   } {
  1204.     if {![info exists inputBox($inputBox(toplevelName),inputMulti)]} {
  1205.       set inputBox($inputBox(toplevelName),inputMulti) ""
  1206.     }
  1207.   }
  1208.   InputBoxInternal $inputBoxMessage $inputBoxCommandOk $inputBoxCommandCancel $inputBoxGeometry $inputBoxTitle 2
  1209.  
  1210.   # wait for the box to be destroyed
  1211.   update idletask
  1212.   grab $inputBox(toplevelName)
  1213.   tkwait window $inputBox(toplevelName)
  1214.  
  1215.   return $inputBox($inputBox(toplevelName),inputMulti)
  1216. }
  1217.  
  1218.  
  1219. # Procedure: InputBoxOne
  1220. proc InputBoxOne { {inputBoxMessage "Input box:"} {inputBoxCommandOk ""} {inputBoxCommandCancel ""} {inputBoxGeometry "350x150"} {inputBoxTitle "Input box"}} {
  1221. # xf ignore me 5
  1222. ##########
  1223. # Procedure: InputBoxOne
  1224. # Description: show input box with one text line
  1225. # Arguments: {inputBoxMessage} - message to display
  1226. #            {inputBoxCommandOk} - the command to call after ok
  1227. #            {inputBoxCommandCancel} - the command to call after cancel
  1228. #            {inputBoxGeometry} - the geometry for the window
  1229. #            {inputBoxTitle} - the title for the window
  1230. # Returns: The entered text
  1231. # Sideeffects: none
  1232. # Notes: there exist also a function called:
  1233. #          InputBoxMulti - to enter multiline text
  1234. ##########
  1235. #
  1236. # global inputBox(activeBackground) - active background color
  1237. # global inputBox(activeForeground) - active foreground color
  1238. # global inputBox(anchor) - anchor for message box
  1239. # global inputBox(background) - background color
  1240. # global inputBox(erase) - erase previous text
  1241. # global inputBox(font) - message font
  1242. # global inputBox(foreground) - foreground color
  1243. # global inputBox(justify) - justify for message box
  1244. # global inputBox(scrollActiveForeground) - scrollbar active background color
  1245. # global inputBox(scrollBackground) - scrollbar background color
  1246. # global inputBox(scrollForeground) - scrollbar foreground color
  1247. # global inputBox(scrollSide) - side where scrollbar is located
  1248. # global inputBox(toplevelName) - the toplevel name
  1249. # global inputBox(toplevelName,inputOne) - the text in the entry widget
  1250.  
  1251.   global inputBox
  1252.  
  1253.   if {$inputBox(erase)} {
  1254.     set inputBox($inputBox(toplevelName),inputOne) ""
  1255.   } {
  1256.     if {![info exists inputBox($inputBox(toplevelName),inputOne)]} {
  1257.       set inputBox($inputBox(toplevelName),inputOne) ""
  1258.     }
  1259.   }
  1260.   InputBoxInternal $inputBoxMessage $inputBoxCommandOk $inputBoxCommandCancel $inputBoxGeometry $inputBoxTitle 1
  1261.  
  1262.   # wait for the box to be destroyed
  1263.   update idletask
  1264.   grab $inputBox(toplevelName)
  1265.   tkwait window $inputBox(toplevelName)
  1266.  
  1267.   return $inputBox($inputBox(toplevelName),inputOne)
  1268. }
  1269.  
  1270.  
  1271. # Procedure: IsADir
  1272. proc IsADir { pathName} {
  1273. # xf ignore me 5
  1274. ##########
  1275. # Procedure: IsADir
  1276. # Description: check if name is a directory (including symbolic links)
  1277. # Arguments: pathName - the path to check
  1278. # Returns: 1 if its a directory, otherwise 0
  1279. # Sideeffects: none
  1280. ##########
  1281.  
  1282.   if {[file isdirectory $pathName]} {
  1283.     return 1
  1284.   } {
  1285.     catch "file type $pathName" fileType
  1286.     if {"$fileType" == "link"} {
  1287.       if {[catch "file readlink $pathName" linkName]} {
  1288.         return 0
  1289.       }
  1290.       catch "file type $linkName" fileType
  1291.       while {"$fileType" == "link"} {
  1292.         if {[catch "file readlink $linkName" linkName]} {
  1293.           return 0
  1294.         }
  1295.         catch "file type $linkName" fileType
  1296.       }
  1297.       return [file isdirectory $linkName]
  1298.     }
  1299.   }
  1300.   return 0
  1301. }
  1302.  
  1303.  
  1304. # Procedure: IsAFile
  1305. proc IsAFile { fileName} {
  1306. # xf ignore me 5
  1307. ##########
  1308. # Procedure: IsAFile
  1309. # Description: check if filename is a file (including symbolic links)
  1310. # Arguments: fileName - the filename to check
  1311. # Returns: 1 if its a file, otherwise 0
  1312. # Sideeffects: none
  1313. ##########
  1314.  
  1315.   if {[file isfile $fileName]} {
  1316.     return 1
  1317.   } {
  1318.     catch "file type $fileName" fileType
  1319.     if {"$fileType" == "link"} {
  1320.       if {[catch "file readlink $fileName" linkName]} {
  1321.         return 0
  1322.       }
  1323.       catch "file type $linkName" fileType
  1324.       while {"$fileType" == "link"} {
  1325.         if {[catch "file readlink $linkName" linkName]} {
  1326.           return 0
  1327.         }
  1328.         catch "file type $linkName" fileType
  1329.       }
  1330.       return [file isfile $linkName]
  1331.     }
  1332.   }
  1333.   return 0
  1334. }
  1335.  
  1336.  
  1337. # Procedure: IsASymlink
  1338. proc IsASymlink { fileName} {
  1339. # xf ignore me 5
  1340. ##########
  1341. # Procedure: IsASymlink
  1342. # Description: check if filename is a symbolic link
  1343. # Arguments: fileName - the path/filename to check
  1344. # Returns: none
  1345. # Sideeffects: none
  1346. ##########
  1347.  
  1348.   catch "file type $fileName" fileType
  1349.   if {"$fileType" == "link"} {
  1350.     return 1
  1351.   }
  1352.   return 0
  1353. }
  1354.  
  1355.  
  1356. # Procedure: TextBox
  1357. proc TextBox { {textBoxMessage "Text message"} {textBoxCommand ""} {textBoxGeometry "350x150"} {textBoxTitle "Text box"} args} {
  1358. # xf ignore me 5
  1359. ##########
  1360. # Procedure: TextBox
  1361. # Description: show text box
  1362. # Arguments: {textBoxMessage} - the text to display
  1363. #            {textBoxCommand} - the command to call after ok
  1364. #            {textBoxGeometry} - the geometry for the window
  1365. #            {textBoxTitle} - the title for the window
  1366. #            {args} - labels of buttons
  1367. # Returns: The number of the selected button, or nothing
  1368. # Sideeffects: none
  1369. # Notes: there exist also functions called:
  1370. #          TextBoxFile - to open and read a file automatically
  1371. #          TextBoxFd - to read from an already opened filedescriptor
  1372. ##########
  1373. #
  1374. # global textBox(activeBackground) - active background color
  1375. # global textBox(activeForeground) - active foreground color
  1376. # global textBox(background) - background color
  1377. # global textBox(font) - text font
  1378. # global textBox(foreground) - foreground color
  1379. # global textBox(scrollActiveForeground) - scrollbar active background color
  1380. # global textBox(scrollBackground) - scrollbar background color
  1381. # global textBox(scrollForeground) - scrollbar foreground color
  1382. # global textBox(scrollSide) - side where scrollbar is located
  1383.  
  1384.   global textBox
  1385.  
  1386.   # show text box
  1387.   if {[llength $args] > 0} {
  1388.     eval TextBoxInternal "\{$textBoxMessage\}" "\{$textBoxCommand\}" "\{$textBoxGeometry\}" "\{$textBoxTitle\}" $args
  1389.   } {
  1390.     TextBoxInternal $textBoxMessage $textBoxCommand $textBoxGeometry $textBoxTitle
  1391.   }
  1392.  
  1393.   if {[llength $args] > 0} {
  1394.     # wait for the box to be destroyed
  1395.     update idletask
  1396.     grab $textBox(toplevelName)
  1397.     tkwait window $textBox(toplevelName)
  1398.  
  1399.     return $textBox(button)
  1400.   }
  1401. }
  1402.  
  1403.  
  1404. # Procedure: TextBoxFd
  1405. proc TextBoxFd { {textBoxInFile ""} {textBoxCommand ""} {textBoxGeometry "350x150"} {textBoxTitle "Text box"} args} {
  1406. # xf ignore me 5
  1407. ##########
  1408. # Procedure: TextBoxFd
  1409. # Description: show text box containing a filedescriptor
  1410. # Arguments: {textBoxInFile} - a filedescriptor to read. The descriptor
  1411. #                              is closed after reading
  1412. #            {textBoxCommand} - the command to call after ok
  1413. #            {textBoxGeometry} - the geometry for the window
  1414. #            {textBoxTitle} - the title for the window
  1415. #            {args} - labels of buttons
  1416. # Returns: The number of the selected button, ot nothing
  1417. # Sideeffects: none
  1418. # Notes: there exist also functions called:
  1419. #          TextBox - to display a passed string
  1420. #          TextBoxFile - to open and read a file automatically
  1421. ##########
  1422. #
  1423. # global textBox(activeBackground) - active background color
  1424. # global textBox(activeForeground) - active foreground color
  1425. # global textBox(background) - background color
  1426. # global textBox(font) - text font
  1427. # global textBox(foreground) - foreground color
  1428. # global textBox(scrollActiveForeground) - scrollbar active background color
  1429. # global textBox(scrollBackground) - scrollbar background color
  1430. # global textBox(scrollForeground) - scrollbar foreground color
  1431. # global textBox(scrollSide) - side where scrollbar is located
  1432.  
  1433.   global textBox
  1434.  
  1435.   # check file existance
  1436.   if {"$textBoxInFile" == ""} {
  1437.     puts stderr "No filedescriptor specified"
  1438.     return
  1439.   }
  1440.  
  1441.   set textBoxMessage [read $textBoxInFile]
  1442.   close $textBoxInFile
  1443.  
  1444.   # show text box
  1445.   if {[llength $args] > 0} {
  1446.     eval TextBoxInternal "\{$textBoxMessage\}" "\{$textBoxCommand\}" "\{$textBoxGeometry\}" "\{$textBoxTitle\}" $args
  1447.   } {
  1448.     TextBoxInternal $textBoxMessage $textBoxCommand $textBoxGeometry $textBoxTitle
  1449.   }
  1450.  
  1451.   if {[llength $args] > 0} {
  1452.     # wait for the box to be destroyed
  1453.     update idletask
  1454.     grab $textBox(toplevelName)
  1455.     tkwait window $textBox(toplevelName)
  1456.  
  1457.     return $textBox(button)
  1458.   }
  1459. }
  1460.  
  1461.  
  1462. # Procedure: TextBoxFile
  1463. proc TextBoxFile { {textBoxFile ""} {textBoxCommand ""} {textBoxGeometry "350x150"} {textBoxTitle "Text box"} args} {
  1464. # xf ignore me 5
  1465. ##########
  1466. # Procedure: TextBoxFile
  1467. # Description: show text box containing a file
  1468. # Arguments: {textBoxFile} - filename to read
  1469. #            {textBoxCommand} - the command to call after ok
  1470. #            {textBoxGeometry} - the geometry for the window
  1471. #            {textBoxTitle} - the title for the window
  1472. #            {args} - labels of buttons
  1473. # Returns: The number of the selected button, ot nothing
  1474. # Sideeffects: none
  1475. # Notes: there exist also functions called:
  1476. #          TextBox - to display a passed string
  1477. #          TextBoxFd - to read from an already opened filedescriptor
  1478. ##########
  1479. #
  1480. # global textBox(activeBackground) - active background color
  1481. # global textBox(activeForeground) - active foreground color
  1482. # global textBox(background) - background color
  1483. # global textBox(font) - text font
  1484. # global textBox(foreground) - foreground color
  1485. # global textBox(scrollActiveForeground) - scrollbar active background color
  1486. # global textBox(scrollBackground) - scrollbar background color
  1487. # global textBox(scrollForeground) - scrollbar foreground color
  1488. # global textBox(scrollSide) - side where scrollbar is located
  1489.  
  1490.   global textBox
  1491.  
  1492.   # check file existance
  1493.   if {"$textBoxFile" == ""} {
  1494.     puts stderr "No filename specified"
  1495.     return
  1496.   }
  1497.  
  1498.   if {[catch "open $textBoxFile r" textBoxInFile]} {
  1499.     puts stderr "$textBoxInFile"
  1500.     return
  1501.   }
  1502.  
  1503.   set textBoxMessage [read $textBoxInFile]
  1504.   close $textBoxInFile
  1505.  
  1506.   # show text box
  1507.   if {[llength $args] > 0} {
  1508.     eval TextBoxInternal "\{$textBoxMessage\}" "\{$textBoxCommand\}" "\{$textBoxGeometry\}" "\{$textBoxTitle\}" $args
  1509.   } {
  1510.     TextBoxInternal $textBoxMessage $textBoxCommand $textBoxGeometry $textBoxTitle
  1511.   }
  1512.  
  1513.   if {[llength $args] > 0} {
  1514.     # wait for the box to be destroyed
  1515.     update idletask
  1516.     grab $textBox(toplevelName)
  1517.     tkwait window $textBox(toplevelName)
  1518.  
  1519.     return $textBox(button)
  1520.   }
  1521. }
  1522.  
  1523.  
  1524. # Procedure: TextBoxInternal
  1525. proc TextBoxInternal { textBoxMessage textBoxCommand textBoxGeometry textBoxTitle args} {
  1526. # xf ignore me 6
  1527.   global textBox
  1528.  
  1529.   set tmpButtonOpt ""
  1530.   set tmpFrameOpt ""
  1531.   set tmpMessageOpt ""
  1532.   set tmpScrollOpt ""
  1533.   if {"$textBox(activeBackground)" != ""} {
  1534.     append tmpButtonOpt "-activebackground \"$textBox(activeBackground)\" "
  1535.   }
  1536.   if {"$textBox(activeForeground)" != ""} {
  1537.     append tmpButtonOpt "-activeforeground \"$textBox(activeForeground)\" "
  1538.   }
  1539.   if {"$textBox(background)" != ""} {
  1540.     append tmpButtonOpt "-background \"$textBox(background)\" "
  1541.     append tmpFrameOpt "-background \"$textBox(background)\" "
  1542.     append tmpMessageOpt "-background \"$textBox(background)\" "
  1543.   }
  1544.   if {"$textBox(font)" != ""} {
  1545.     append tmpButtonOpt "-font \"$textBox(font)\" "
  1546.     append tmpMessageOpt "-font \"$textBox(font)\" "
  1547.   }
  1548.   if {"$textBox(foreground)" != ""} {
  1549.     append tmpButtonOpt "-foreground \"$textBox(foreground)\" "
  1550.     append tmpMessageOpt "-foreground \"$textBox(foreground)\" "
  1551.   }
  1552.   if {"$textBox(scrollActiveForeground)" != ""} {
  1553.     append tmpScrollOpt "-activeforeground \"$textBox(scrollActiveForeground)\" "
  1554.   }
  1555.   if {"$textBox(scrollBackground)" != ""} {
  1556.     append tmpScrollOpt "-background \"$textBox(scrollBackground)\" "
  1557.   }
  1558.   if {"$textBox(scrollForeground)" != ""} {
  1559.     append tmpScrollOpt "-foreground \"$textBox(scrollForeground)\" "
  1560.   }
  1561.  
  1562.   # start build of toplevel
  1563.   if {"[info commands XFDestroy]" != ""} {
  1564.     catch {XFDestroy $textBox(toplevelName)}
  1565.   } {
  1566.     catch {destroy $textBox(toplevelName)}
  1567.   }
  1568.   toplevel $textBox(toplevelName)  -borderwidth 0
  1569.   catch "$textBox(toplevelName) config $tmpFrameOpt"
  1570.   if {[catch "wm geometry $textBox(toplevelName) $textBoxGeometry"]} {
  1571.     wm geometry $textBox(toplevelName) 350x150
  1572.   }
  1573.   wm title $textBox(toplevelName) $textBoxTitle
  1574.   wm maxsize $textBox(toplevelName) 1000 1000
  1575.   wm minsize $textBox(toplevelName) 100 100
  1576.   # end build of toplevel
  1577.  
  1578.   frame $textBox(toplevelName).frame0  -borderwidth 0  -relief raised
  1579.   catch "$textBox(toplevelName).frame0 config $tmpFrameOpt"
  1580.  
  1581.   text $textBox(toplevelName).frame0.text1  -relief raised  -wrap none  -borderwidth 2  -yscrollcommand "$textBox(toplevelName).frame0.vscroll set"
  1582.   catch "$textBox(toplevelName).frame0.text1 config $tmpMessageOpt"
  1583.  
  1584.   scrollbar $textBox(toplevelName).frame0.vscroll  -relief raised  -command "$textBox(toplevelName).frame0.text1 yview"
  1585.   catch "$textBox(toplevelName).frame0.vscroll config $tmpScrollOpt"
  1586.  
  1587.   frame $textBox(toplevelName).frame1  -borderwidth 0  -relief raised
  1588.   catch "$textBox(toplevelName).frame1 config $tmpFrameOpt"
  1589.  
  1590.   set textBoxCounter 0
  1591.   set buttonNum [llength $args]
  1592.  
  1593.   if {$buttonNum > 0} {
  1594.     while {$textBoxCounter < $buttonNum} {
  1595.       button $textBox(toplevelName).frame1.button$textBoxCounter  -text "[lindex $args $textBoxCounter]"  -command "
  1596.           global textBox
  1597.           set textBox(button) $textBoxCounter
  1598.           set textBox(contents) \[$textBox(toplevelName).frame0.text1 get 1.0 end\]
  1599.           if {\"\[info commands XFDestroy\]\" != \"\"} {
  1600.             catch {XFDestroy $textBox(toplevelName)}
  1601.           } {
  1602.             catch {destroy $textBox(toplevelName)}
  1603.           }"
  1604.       catch "$textBox(toplevelName).frame1.button$textBoxCounter config $tmpButtonOpt"
  1605.  
  1606.       pack append $textBox(toplevelName).frame1  $textBox(toplevelName).frame1.button$textBoxCounter {left fillx expand}
  1607.  
  1608.       incr textBoxCounter
  1609.     }
  1610.   } {
  1611.     button $textBox(toplevelName).frame1.button0  -text "OK"  -command "
  1612.         global textBox
  1613.         set textBox(button) 0
  1614.         set textBox(contents) \[$textBox(toplevelName).frame0.text1 get 1.0 end\]
  1615.         if {\"\[info commands XFDestroy\]\" != \"\"} {
  1616.           catch {XFDestroy $textBox(toplevelName)}
  1617.         } {
  1618.           catch {destroy $textBox(toplevelName)}
  1619.         }
  1620.         $textBoxCommand"
  1621.     catch "$textBox(toplevelName).frame1.button0 config $tmpButtonOpt"
  1622.  
  1623.     pack append $textBox(toplevelName).frame1  $textBox(toplevelName).frame1.button0 {left fillx expand}
  1624.   }
  1625.  
  1626.   $textBox(toplevelName).frame0.text1 insert end "$textBoxMessage"
  1627.  
  1628.   $textBox(toplevelName).frame0.text1 config  -state $textBox(state)
  1629.  
  1630.   # packing
  1631.   pack append $textBox(toplevelName).frame0  $textBox(toplevelName).frame0.vscroll "$textBox(scrollSide) filly"  $textBox(toplevelName).frame0.text1 {left fill expand}
  1632.   pack append $textBox(toplevelName)  $textBox(toplevelName).frame1 {bottom fill}  $textBox(toplevelName).frame0 {top fill expand}
  1633. }
  1634.  
  1635.  
  1636. # Procedure: VersionAlertBox
  1637. proc VersionAlertBox {} {
  1638.   global Ident
  1639.   AlertBox [format "Role Playing DataBase system V1.0\n\n%s" $Ident] "" 400x80
  1640. }
  1641.  
  1642.  
  1643. # Procedure: YesNoBox
  1644. proc YesNoBox { {yesNoBoxMessage "Yes/no message"} {yesNoBoxGeometry "350x150"}} {
  1645. # xf ignore me 5
  1646. ##########
  1647. # Procedure: YesNoBox
  1648. # Description: show yesno box
  1649. # Arguments: {yesNoBoxMessage} - the text to display
  1650. #            {yesNoBoxGeometry} - the geometry for the window
  1651. # Returns: none
  1652. # Sideeffects: none
  1653. ##########
  1654. #
  1655. # global yesNoBox(activeBackground) - active background color
  1656. # global yesNoBox(activeForeground) - active foreground color
  1657. # global yesNoBox(anchor) - anchor for message box
  1658. # global yesNoBox(background) - background color
  1659. # global yesNoBox(font) - message font
  1660. # global yesNoBox(foreground) - foreground color
  1661. # global yesNoBox(justify) - justify for message box
  1662. # global yesNoBox(afterNo) - destroy yes-no box after n seconds.
  1663. #                            The no button is activated
  1664. # global yesNoBox(afterYes) - destroy yes-no box after n seconds.
  1665. #                             The yes button is activated
  1666.  
  1667.   global yesNoBox
  1668.  
  1669.   set tmpButtonOpt ""
  1670.   set tmpFrameOpt ""
  1671.   set tmpMessageOpt ""
  1672.   if {"$yesNoBox(activeBackground)" != ""} {
  1673.     append tmpButtonOpt "-activebackground \"$yesNoBox(activeBackground)\" "
  1674.   }
  1675.   if {"$yesNoBox(activeForeground)" != ""} {
  1676.     append tmpButtonOpt "-activeforeground \"$yesNoBox(activeForeground)\" "
  1677.   }
  1678.   if {"$yesNoBox(background)" != ""} {
  1679.     append tmpButtonOpt "-background \"$yesNoBox(background)\" "
  1680.     append tmpFrameOpt "-background \"$yesNoBox(background)\" "
  1681.     append tmpMessageOpt "-background \"$yesNoBox(background)\" "
  1682.   }
  1683.   if {"$yesNoBox(font)" != ""} {
  1684.     append tmpButtonOpt "-font \"$yesNoBox(font)\" "
  1685.     append tmpMessageOpt "-font \"$yesNoBox(font)\" "
  1686.   }
  1687.   if {"$yesNoBox(foreground)" != ""} {
  1688.     append tmpButtonOpt "-foreground \"$yesNoBox(foreground)\" "
  1689.     append tmpMessageOpt "-foreground \"$yesNoBox(foreground)\" "
  1690.   }
  1691.  
  1692.   # start build of toplevel
  1693.   if {"[info commands XFDestroy]" != ""} {
  1694.     catch {XFDestroy .yesNoBox}
  1695.   } {
  1696.     catch {destroy .yesNoBox}
  1697.   }
  1698.   toplevel .yesNoBox  -borderwidth 0
  1699.   catch ".yesNoBox config $tmpFrameOpt"
  1700.   if {[catch "wm geometry .yesNoBox $yesNoBoxGeometry"]} {
  1701.     wm geometry .yesNoBox 350x150
  1702.   }
  1703.   wm title .yesNoBox {Alert box}
  1704.   wm maxsize .yesNoBox 1000 1000
  1705.   wm minsize .yesNoBox 100 100
  1706.   # end build of toplevel
  1707.  
  1708.   message .yesNoBox.message1  -anchor "$yesNoBox(anchor)"  -justify "$yesNoBox(justify)"  -relief raised  -text "$yesNoBoxMessage"
  1709.   catch ".yesNoBox.message1 config $tmpMessageOpt"
  1710.  
  1711.   set xfTmpWidth  [string range $yesNoBoxGeometry 0 [expr [string first x $yesNoBoxGeometry]-1]]
  1712.   if {"$xfTmpWidth" != ""} {
  1713.     # set message size
  1714.     catch ".yesNoBox.message1 configure  -width [expr $xfTmpWidth-10]"
  1715.   } {
  1716.     .yesNoBox.message1 configure  -aspect 1500
  1717.   }
  1718.  
  1719.   frame .yesNoBox.frame1  -borderwidth 0  -relief raised
  1720.   catch ".yesNoBox.frame1 config $tmpFrameOpt"
  1721.  
  1722.   button .yesNoBox.frame1.button0  -text "Yes"  -command "
  1723.       global yesNoBox
  1724.       set yesNoBox(button) 1
  1725.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  1726.         catch {XFDestroy .yesNoBox}
  1727.       } {
  1728.         catch {destroy .yesNoBox}
  1729.       }"
  1730.   catch ".yesNoBox.frame1.button0 config $tmpButtonOpt"
  1731.  
  1732.   button .yesNoBox.frame1.button1  -text "No"  -command "
  1733.       global yesNoBox
  1734.       set yesNoBox(button) 0
  1735.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  1736.         catch {XFDestroy .yesNoBox}
  1737.       } {
  1738.         catch {destroy .yesNoBox}
  1739.       }"
  1740.   catch ".yesNoBox.frame1.button1 config $tmpButtonOpt"
  1741.  
  1742.   pack append .yesNoBox.frame1  .yesNoBox.frame1.button0 {left fillx expand}  .yesNoBox.frame1.button1 {left fillx expand}
  1743.  
  1744.   # packing
  1745.   pack append .yesNoBox  .yesNoBox.frame1 {bottom fill}  .yesNoBox.message1 {top fill expand}
  1746.  
  1747.   if {$yesNoBox(afterYes) != 0} {
  1748.     after [expr $yesNoBox(afterYes)*1000]  "catch \".yesNoBox.frame1.button0 invoke\""
  1749.   }
  1750.   if {$yesNoBox(afterNo) != 0} {
  1751.     after [expr $yesNoBox(afterNo)*1000]  "catch \".yesNoBox.frame1.button1 invoke\""
  1752.   }
  1753.  
  1754.   # wait for the box to be destroyed
  1755.   update idletask
  1756.   grab .yesNoBox
  1757.   tkwait window .yesNoBox
  1758.  
  1759.   return $yesNoBox(button)
  1760. }
  1761.  
  1762.  
  1763. # Internal procedures
  1764.  
  1765.  
  1766. # Procedure: Alias
  1767. proc Alias { args} {
  1768. # xf ignore me 7
  1769. ##########
  1770. # Procedure: Alias
  1771. # Description: establish an alias for a procedure
  1772. # Arguments: args - no argument means that a list of all aliases
  1773. #                   is returned. Otherwise the first parameter is
  1774. #                   the alias name, and the second parameter is
  1775. #                   the procedure that is aliased.
  1776. # Returns: nothing, the command that is bound to the alias or a
  1777. #          list of all aliases - command pairs. 
  1778. # Sideeffects: internalAliasList is updated, and the alias
  1779. #              proc is inserted
  1780. ##########
  1781.   global internalAliasList
  1782.  
  1783.   if {[llength $args] == 0} {
  1784.     return $internalAliasList
  1785.   } {
  1786.     if {[llength $args] == 1} {
  1787.       set xfTmpIndex [lsearch $internalAliasList "[lindex $args 0] *"]
  1788.       if {$xfTmpIndex != -1} {
  1789.         return [lindex [lindex $internalAliasList $xfTmpIndex] 1]
  1790.       }
  1791.     } {
  1792.       if {[llength $args] == 2} {
  1793.         eval "proc [lindex $args 0] {args} {#xf ignore me 4
  1794. return \[eval \"[lindex $args 1] \$args\"\]}"
  1795.         set xfTmpIndex [lsearch $internalAliasList "[lindex $args 0] *"]
  1796.         if {$xfTmpIndex != -1} {
  1797.           set internalAliasList [lreplace $internalAliasList $xfTmpIndex $xfTmpIndex "[lindex $args 0] [lindex $args 1]"]
  1798.         } {
  1799.           lappend internalAliasList "[lindex $args 0] [lindex $args 1]"
  1800.         }
  1801.       } {
  1802.         error "Alias: wrong number or args: $args"
  1803.       }
  1804.     }
  1805.   }
  1806. }
  1807.  
  1808.  
  1809. # Procedure: GetSelection
  1810. if {"[info procs GetSelection]" == ""} {
  1811. proc GetSelection {} {
  1812. # xf ignore me 7
  1813. ##########
  1814. # Procedure: GetSelection
  1815. # Description: get current selection
  1816. # Arguments: none
  1817. # Returns: none
  1818. # Sideeffects: none
  1819. ##########
  1820.  
  1821.   # the save way
  1822.   set xfSelection ""
  1823.   catch "selection get" xfSelection
  1824.   if {"$xfSelection" == "selection doesn't exist or form \"STRING\" not defined"} {
  1825.     return ""
  1826.   } {
  1827.     return $xfSelection
  1828.   }
  1829. }
  1830. }
  1831.  
  1832.  
  1833. # Procedure: Unalias
  1834. proc Unalias { aliasName} {
  1835. # xf ignore me 7
  1836. ##########
  1837. # Procedure: Unalias
  1838. # Description: remove an alias for a procedure
  1839. # Arguments: aliasName - the alias name to remove
  1840. # Returns: none
  1841. # Sideeffects: internalAliasList is updated, and the alias
  1842. #              proc is removed
  1843. ##########
  1844.   global internalAliasList
  1845.  
  1846.   set xfIndex [lsearch $internalAliasList "$aliasName *"]
  1847.   if {$xfIndex != -1} {
  1848.     rename $aliasName ""
  1849.     set internalAliasList [lreplace $internalAliasList $xfIndex $xfIndex]
  1850.   }
  1851. }
  1852.  
  1853. # XFNoParsing
  1854. # Program: template
  1855. # Description: select colors
  1856. #
  1857. # The HSV <-> RGB converting routines are from the
  1858. # tcolor demo that is part of the demo site of Tk.
  1859. #
  1860. # $Header: /home/heller/Deepwoods/RolePlaying/RCS/SYSFunctions,v 1.3 1995/07/03 18:24:02 heller Exp $
  1861.  
  1862. proc ColorBox {{colorBoxFileColor "/usr/local/lib/xf/lib/Colors"} {colorBoxMessage "Color"} {colorBoxEntryW ""} {colorBoxTargetW ""}} {# xf ignore me 5
  1863. ##########
  1864. # Procedure: ColorBox
  1865. # Description: select a color
  1866. # Arguments: {colorBoxFileColor} - the color file with all colornames
  1867. #            {colorBoxMessage} - a message to display
  1868. #            {colorBoxEntryW} - the widget name for the resulting color name
  1869. #            {colorBoxTargetW} - the widget we configure
  1870. # Returns: colorname, or nothing
  1871. # Sideeffects: none
  1872. ##########
  1873. # global colorBox(activeBackground) - active background color
  1874. # global colorBox(activeForeground) - active foreground color
  1875. # global colorBox(background) - background color
  1876. # global colorBox(font) - text font
  1877. # global colorBox(foreground) - foreground color
  1878. # global colorBox(palette) - a palette of colors
  1879. # global colorBox(scrollActiveForeground) - scrollbar active background color
  1880. # global colorBox(scrollBackground) - scrollbar background color
  1881. # global colorBox(scrollForeground) - scrollbar foreground color
  1882. # global colorBox(scrollSide) - side where scrollbar is located
  1883.  
  1884.   global colorBox
  1885.  
  1886.   set colorBox(colorName) ""
  1887.   set colorBox(paletteNr) 0
  1888.  
  1889.   set tmpButtonOpt ""
  1890.   set tmpFrameOpt ""
  1891.   set tmpMessageOpt ""
  1892.   set tmpScaleOpt ""
  1893.   set tmpScrollOpt ""
  1894.   if {"$colorBox(activeBackground)" != ""} {
  1895.     append tmpButtonOpt "-activebackground \"$colorBox(activeBackground)\" "
  1896.   }
  1897.   if {"$colorBox(activeForeground)" != ""} {
  1898.     append tmpButtonOpt "-activeforeground \"$colorBox(activeForeground)\" "
  1899.   }
  1900.   if {"$colorBox(background)" != ""} {
  1901.     append tmpButtonOpt "-background \"$colorBox(background)\" "
  1902.     append tmpFrameOpt "-background \"$colorBox(background)\" "
  1903.     append tmpMessageOpt "-background \"$colorBox(background)\" "
  1904.     append tmpScaleOpt "-background \"$colorBox(background)\" "
  1905.   }
  1906.   if {"$colorBox(font)" != ""} {
  1907.     append tmpButtonOpt "-font \"$colorBox(font)\" "
  1908.     append tmpMessageOpt "-font \"$colorBox(font)\" "
  1909.   }
  1910.   if {"$colorBox(foreground)" != ""} {
  1911.     append tmpButtonOpt "-foreground \"$colorBox(foreground)\" "
  1912.     append tmpMessageOpt "-foreground \"$colorBox(foreground)\" "
  1913.     append tmpScaleOpt "-foreground \"$colorBox(foreground)\" "
  1914.   }
  1915.   if {"$colorBox(scrollActiveForeground)" != ""} {
  1916.     append tmpScaleOpt "-activeforeground \"$colorBox(scrollActiveForeground)\" "
  1917.     append tmpScrollOpt "-activeforeground \"$colorBox(scrollActiveForeground)\" "
  1918.   }
  1919.   if {"$colorBox(scrollBackground)" != ""} {
  1920.     append tmpScrollOpt "-background \"$colorBox(scrollBackground)\" "
  1921.   }
  1922.   if {"$colorBox(scrollForeground)" != ""} {
  1923.     append tmpScrollOpt "-foreground \"$colorBox(scrollForeground)\" "
  1924.   }
  1925.  
  1926.   # get color file name
  1927.   if {!([file exists $colorBoxFileColor] &&
  1928.         [file readable $colorBoxFileColor])} {
  1929.     set colorBoxFileColor ""
  1930.   }
  1931.   if {"$colorBoxFileColor" == ""} {
  1932.     global env
  1933.     if {[info exists env(XF_COLOR_FILE)]} {
  1934.       if {[file exists $env(XF_COLOR_FILE)] &&
  1935.           [file readable $env(XF_COLOR_FILE)]} {
  1936.         set colorBoxFileColor $env(XF_COLOR_FILE)
  1937.       }
  1938.     }
  1939.   }
  1940.   if {"$colorBoxMessage" == ""} {
  1941.     set colorBoxMessage "Color"
  1942.   }
  1943.  
  1944.   # save the the current widget color
  1945.   if {"$colorBoxTargetW" != ""} {
  1946.     if {[catch "$colorBoxTargetW config -[string tolower $colorBoxMessage]" result]} {
  1947.       set colorBoxSavedColor ""
  1948.     } {
  1949.       set colorBoxSavedColor [lindex $result 4]
  1950.     }
  1951.   } {
  1952.     set colorBoxSavedColor ""
  1953.   }
  1954.  
  1955.   # look if there is already a color window
  1956.   if {"[info commands .colorBox]" == ""} {
  1957.     # build widget structure
  1958.  
  1959.     # start build of toplevel
  1960.     if {"[info commands XFDestroy]" != ""} {
  1961.       catch {XFDestroy .colorBox}
  1962.     } {
  1963.       catch {destroy .colorBox}
  1964.     }
  1965.     toplevel .colorBox \
  1966.       -borderwidth 0
  1967.     catch ".colorBox config $tmpFrameOpt"
  1968.     wm geometry .colorBox 400x250
  1969.     wm title .colorBox {Color box}
  1970.     wm maxsize .colorBox 1000 1000
  1971.     wm minsize .colorBox 100 100
  1972.     # end build of toplevel
  1973.  
  1974.     set colorBox(oldWidget) $colorBoxEntryW
  1975.  
  1976.     frame .colorBox.frame1 \
  1977.       -borderwidth 0 \
  1978.       -relief raised
  1979.     catch ".colorBox.frame1 config $tmpFrameOpt"
  1980.  
  1981.     button .colorBox.frame1.ok \
  1982.       -text "OK"
  1983.     catch ".colorBox.frame1.ok config $tmpButtonOpt"
  1984.  
  1985.     button .colorBox.frame1.cancel \
  1986.       -text "Cancel"
  1987.     catch ".colorBox.frame1.cancel config $tmpButtonOpt"
  1988.  
  1989.     frame .colorBox.frame2 \
  1990.       -borderwidth 0 \
  1991.       -relief raised
  1992.     catch ".colorBox.frame2 config $tmpFrameOpt"
  1993.  
  1994.     radiobutton .colorBox.frame2.rgb \
  1995.       -command "ColorBoxShowSlides $colorBoxMessage \"$colorBoxTargetW\"" \
  1996.       -text "RGB" \
  1997.       -variable colorBox(type)
  1998.     catch ".colorBox.frame2.rgb config $tmpButtonOpt"
  1999.  
  2000.     radiobutton .colorBox.frame2.hsv \
  2001.       -command "ColorBoxShowSlides $colorBoxMessage \"$colorBoxTargetW\"" \
  2002.       -text "HSV" \
  2003.       -variable colorBox(type)
  2004.     catch ".colorBox.frame2.hsv config $tmpButtonOpt"
  2005.  
  2006.     radiobutton .colorBox.frame2.list \
  2007.       -command "ColorBoxShowSlides $colorBoxMessage \"$colorBoxTargetW\"" \
  2008.       -text "List" \
  2009.       -variable colorBox(type)
  2010.     catch ".colorBox.frame2.list config $tmpButtonOpt"
  2011.  
  2012.     frame .colorBox.palette \
  2013.       -borderwidth 0 \
  2014.       -relief raised
  2015.     catch ".colorBox.palette config $tmpFrameOpt"
  2016.  
  2017.     set counter 0
  2018.     foreach element $colorBox(palette) {
  2019.       button .colorBox.palette.palette$counter \
  2020.         -command "ColorBoxSetPalette $colorBoxMessage \"$colorBoxTargetW\" $counter" \
  2021.                -width 3
  2022.       catch ".colorBox.palette.palette$counter config \
  2023.         -activebackground \"$element\" \
  2024.         -background \"$element\""
  2025.  
  2026.       pack append .colorBox.palette .colorBox.palette.palette$counter {left fill expand}
  2027.       incr counter
  2028.     }
  2029.  
  2030.     scale .colorBox.red \
  2031.       -background "red" \
  2032.       -from 0 \
  2033.       -label "Red" \
  2034.       -orient horizontal \
  2035.       -relief raised \
  2036.       -sliderlength 15 \
  2037.       -to 255 \
  2038.       -width 8
  2039.     catch ".colorBox.red config $tmpScaleOpt"
  2040.  
  2041.     scale .colorBox.green \
  2042.       -background "green" \
  2043.       -from 0 \
  2044.       -label "Green" \
  2045.       -orient horizontal \
  2046.       -relief raised \
  2047.       -sliderlength 15 \
  2048.       -to 255 \
  2049.       -width 8
  2050.     catch ".colorBox.green config $tmpScaleOpt"
  2051.  
  2052.     scale .colorBox.blue \
  2053.       -background "blue" \
  2054.       -from 0 \
  2055.       -label "Blue" \
  2056.       -orient horizontal \
  2057.       -relief raised \
  2058.       -sliderlength 15 \
  2059.       -to 255 \
  2060.       -width 8
  2061.     catch ".colorBox.blue config $tmpScaleOpt"
  2062.  
  2063.     scale .colorBox.h \
  2064.       -from 0 \
  2065.       -label "Hue" \
  2066.       -orient horizontal \
  2067.       -relief raised \
  2068.       -sliderlength 15 \
  2069.       -to 1000 \
  2070.       -width 8
  2071.     catch ".colorBox.h config $tmpScaleOpt"
  2072.  
  2073.    scale .colorBox.s \
  2074.      -from 0 \
  2075.      -label "Saturation * 100" \
  2076.      -orient horizontal \
  2077.      -relief raised \
  2078.      -sliderlength 15 \
  2079.      -to 1000 \
  2080.      -width 8
  2081.     catch ".colorBox.s config $tmpScaleOpt"
  2082.  
  2083.     scale .colorBox.v \
  2084.       -from 0 \
  2085.       -label "Value" \
  2086.       -orient horizontal \
  2087.       -relief raised \
  2088.       -sliderlength 15 \
  2089.       -to 1000 \
  2090.       -width 8
  2091.     catch ".colorBox.v config $tmpScaleOpt"
  2092.  
  2093.     label .colorBox.demo \
  2094.       -relief raised \
  2095.       -text "This text shows the results :-)"
  2096.     catch ".colorBox.demo config $tmpMessageOpt"
  2097.  
  2098.     frame .colorBox.current \
  2099.       -borderwidth 0 \
  2100.       -relief raised
  2101.     catch ".colorBox.current config $tmpFrameOpt"
  2102.  
  2103.     label .colorBox.current.labelcurrent \
  2104.       -relief raised
  2105.     catch ".colorBox.current.labelcurrent config $tmpMessageOpt"
  2106.  
  2107.     entry .colorBox.current.current \
  2108.       -relief raised
  2109.     catch ".colorBox.current.current config $tmpMessageOpt"
  2110.  
  2111.     frame .colorBox.colors \
  2112.       -borderwidth 0 \
  2113.       -relief raised
  2114.     catch ".colorBox.colors config $tmpFrameOpt"
  2115.  
  2116.     scrollbar .colorBox.colors.vscroll \
  2117.       -relief raised \
  2118.       -command ".colorBox.colors.colors yview"
  2119.     catch ".colorBox.colors.vscroll config $tmpScrollOpt"
  2120.  
  2121.     scrollbar .colorBox.colors.hscroll \
  2122.       -orient horiz \
  2123.       -relief raised \
  2124.       -command ".colorBox.colors.colors xview"
  2125.     catch ".colorBox.colors.hscroll config $tmpScrollOpt"
  2126.  
  2127.     listbox .colorBox.colors.colors \
  2128.       -exportselection false \
  2129.       -relief raised \
  2130.       -xscrollcommand ".colorBox.colors.hscroll set" \
  2131.       -yscrollcommand ".colorBox.colors.vscroll set"
  2132.     catch ".colorBox.colors.colors config $tmpMessageOpt"
  2133.  
  2134.     # read color file
  2135.     if {"$colorBoxFileColor" != ""} {
  2136.       if {[catch "open $colorBoxFileColor r" colorInFile]} {
  2137.         set colorBoxFileColor ""
  2138.         if {"[info commands AlertBox]" != ""} {
  2139.           AlertBox "$colorInFile"
  2140.         } {
  2141.           puts stderr "$colorInFile"
  2142.         }
  2143.       } {
  2144.         set colorReadList [read $colorInFile]
  2145.         close $colorInFile
  2146.         foreach colorLine [split $colorReadList "\n"] {
  2147.           if {"[string trim $colorLine]" != ""} {
  2148.             set colorNewLine [lrange $colorLine 3 end]
  2149.             append colorNewLine " " [format #%02x [lindex $colorLine 0]]
  2150.             append colorNewLine [format %02x [lindex $colorLine 1]]
  2151.             append colorNewLine [format %02x [lindex $colorLine 2]]
  2152.             .colorBox.colors.colors insert end $colorNewLine
  2153.           }
  2154.         }
  2155.       }
  2156.     }
  2157.  
  2158.     # bindings
  2159.     bind .colorBox.colors.colors <ButtonPress-1> "
  2160.       ColorBoxSelectColor %W $colorBoxMessage \"$colorBoxTargetW\" %y"
  2161.     bind .colorBox.colors.colors <Button1-Motion> "
  2162.       ColorBoxSelectColor %W $colorBoxMessage \"$colorBoxTargetW\" %y"
  2163.     bind .colorBox.colors.colors <Shift-ButtonPress-1> "
  2164.       ColorBoxSelectColor %W $colorBoxMessage \"$colorBoxTargetW\" %y"
  2165.     bind .colorBox.colors.colors <Shift-Button1-Motion> "
  2166.       ColorBoxSelectColor %W $colorBoxMessage \"$colorBoxTargetW\" %y"
  2167.   } {
  2168.     if {"[winfo class $colorBox(oldWidget)]" == "Text"} {
  2169.       catch "$colorBox(oldWidget) delete 1.0 end"
  2170.       catch "$colorBox(oldWidget) insert 1.0 [.colorBox.current.current get]"
  2171.     } {
  2172.       if {"[winfo class $colorBox(oldWidget)]" == "Entry"} {
  2173.         catch "$colorBox(oldWidget) delete 0 end"
  2174.         catch "$colorBox(oldWidget) insert 0 [.colorBox.current.current get]"
  2175.       }
  2176.     }
  2177.  
  2178.     set colorBox(oldWidget) $colorBoxEntryW
  2179.   }
  2180.    
  2181.   .colorBox.frame1.ok config \
  2182.     -command "
  2183.       global colorBox
  2184.       set colorBox(colorName) \[.colorBox.current.current get\]
  2185.       if {\"$colorBoxEntryW\" != \"\"} {
  2186.         if {\"\[winfo class $colorBoxEntryW\]\" == \"Text\"} {
  2187.           catch \"$colorBoxEntryW delete 1.0 end\"
  2188.           catch \"$colorBoxEntryW insert 1.0 \\\"\$colorBox(colorName)\\\"\"
  2189.         } {
  2190.           if {\"\[winfo class $colorBoxEntryW\]\" == \"Entry\"} {
  2191.             catch \"$colorBoxEntryW delete 0 end\"
  2192.             catch \"$colorBoxEntryW insert 0 \\\"\$colorBox(colorName)\\\"\"
  2193.           }
  2194.         }
  2195.       }
  2196.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  2197.         catch {XFDestroy .colorBox}
  2198.       } {
  2199.         catch {destroy .colorBox}
  2200.       }"
  2201.  
  2202.   .colorBox.frame1.cancel config \
  2203.     -command "
  2204.       global colorBox
  2205.       set colorBox(colorName) {}
  2206.       if {\"$colorBoxTargetW\" != \"\"} {
  2207.         catch \"$colorBoxTargetW config -\[string tolower $colorBoxMessage\] $colorBoxSavedColor\"
  2208.       }
  2209.       if {\"\[info commands XFDestroy\]\" != \"\"} {
  2210.         catch {XFDestroy .colorBox}
  2211.       } {
  2212.         catch {destroy .colorBox}
  2213.       }"
  2214.  
  2215.   .colorBox.red config \
  2216.     -command "ColorBoxSetRGBColor $colorBoxMessage \"$colorBoxTargetW\""
  2217.  
  2218.   .colorBox.green config \
  2219.     -command "ColorBoxSetRGBColor $colorBoxMessage \"$colorBoxTargetW\""
  2220.  
  2221.   .colorBox.blue config \
  2222.     -command "ColorBoxSetRGBColor $colorBoxMessage \"$colorBoxTargetW\""
  2223.  
  2224.   .colorBox.h config \
  2225.     -command "ColorBoxSetHSVColor $colorBoxMessage \"$colorBoxTargetW\""
  2226.  
  2227.   .colorBox.s config \
  2228.     -command "ColorBoxSetHSVColor $colorBoxMessage \"$colorBoxTargetW\""
  2229.  
  2230.   .colorBox.v config \
  2231.     -command "ColorBoxSetHSVColor $colorBoxMessage \"$colorBoxTargetW\""
  2232.  
  2233.   .colorBox.current.labelcurrent config \
  2234.     -text "$colorBoxMessage:"
  2235.  
  2236.   # bindings
  2237.   bind .colorBox.current.current <Return> "
  2238.     ColorBoxSetPaletteList \[.colorBox.current.current get\]
  2239.     ColorBoxSetColor $colorBoxMessage \"$colorBoxTargetW\" text \[.colorBox.current.current get\]"
  2240.  
  2241.   bind .colorBox.colors.colors <Double-1> "
  2242.     ColorBoxSelectColor %W $colorBoxMessage \"$colorBoxTargetW\" %y
  2243.     global colorBox
  2244.     set colorBox(colorName) \[.colorBox.current.current get\]
  2245.     if {\"$colorBoxEntryW\" != \"\"} {
  2246.       if {\"\[winfo class $colorBoxEntryW\]\" == \"Text\"} {
  2247.         catch \"$colorBoxEntryW delete 1.0 end\"
  2248.         catch \"$colorBoxEntryW insert 1.0 \\\"\$colorBox(colorName)\\\"\"
  2249.       } {
  2250.         if {\"\[winfo class $colorBoxEntryW\]\" == \"Entry\"} {
  2251.           catch \"$colorBoxEntryW delete 0 end\"
  2252.           catch \"$colorBoxEntryW insert 0 \\\"\$colorBox(colorName)\\\"\"
  2253.         }
  2254.       }
  2255.     }
  2256.     if {\"\[info commands XFDestroy\]\" != \"\"} {
  2257.       catch {XFDestroy .colorBox}
  2258.     } {
  2259.       catch {destroy .colorBox}
  2260.     }"
  2261.  
  2262.   # set up current value
  2263.   .colorBox.current.current delete 0 end
  2264.   if {"$colorBoxEntryW" != ""} {
  2265.     if {"[winfo class $colorBoxEntryW]" == "Text"} {
  2266.       .colorBox.current.current insert 0 [$colorBoxEntryW get 1.0 end]
  2267.     } {
  2268.       if {"[winfo class $colorBoxEntryW]" == "Entry"} {
  2269.         .colorBox.current.current insert 0 [$colorBoxEntryW get]
  2270.       }
  2271.     }
  2272.   }
  2273.   if {"[.colorBox.current.current get]" != ""} {
  2274.     ColorBoxSetColor $colorBoxMessage $colorBoxTargetW text [.colorBox.current.current get]
  2275.   }
  2276.     
  2277.   # packing
  2278.   pack append .colorBox.frame1 \
  2279.               .colorBox.frame1.ok {left fill expand} \
  2280.               .colorBox.frame1.cancel {left fill expand}
  2281.   pack append .colorBox.frame2 \
  2282.               .colorBox.frame2.rgb {left fill expand} \
  2283.               .colorBox.frame2.hsv {left fill expand} \
  2284.               .colorBox.frame2.list {left fill expand}
  2285.   pack append .colorBox.current \
  2286.               .colorBox.current.labelcurrent {left} \
  2287.               .colorBox.current.current {left fill expand}
  2288.   pack append .colorBox.colors \
  2289.               .colorBox.colors.vscroll "$colorBox(scrollSide) filly" \
  2290.               .colorBox.colors.hscroll {bottom fillx} \
  2291.               .colorBox.colors.colors {left fill expand}
  2292.  
  2293.   ColorBoxShowSlides $colorBoxMessage $colorBoxTargetW
  2294.  
  2295.   catch "wm deiconify .colorBox"
  2296.  
  2297.   if {"$colorBoxEntryW" == ""} {
  2298.     # wait for the box to be destroyed
  2299.     update idletask
  2300.     grab .colorBox
  2301.     tkwait window .colorBox
  2302.  
  2303.     return $colorBox(colorName)
  2304.   }
  2305. }
  2306.  
  2307. ##########
  2308. # Procedure: ColorBoxSelectColor
  2309. # Description: select color for color composing
  2310. # Arguments: colorW - the widget
  2311. #            colorBoxMessage - the message for the color
  2312. #            colorBoxTargetW - the widget we configure
  2313. #            colorY - the y position in the listbox
  2314. # Returns: none
  2315. # Sideeffects: none
  2316. ##########
  2317. proc ColorBoxSelectColor {colorW colorBoxMessage colorBoxTargetW colorY} {# xf ignore me 6
  2318.  
  2319.   set colorNearest [$colorW nearest $colorY]
  2320.   if {$colorNearest >= 0} {
  2321.     $colorW select from $colorNearest
  2322.     $colorW select to $colorNearest
  2323.     set colorTmpValue [$colorW get $colorNearest]
  2324.     set colorCurrentColor [lrange $colorTmpValue 0 \
  2325.           [expr [llength $colorTmpValue]-2]]
  2326.     set colorCurrentValue [lrange $colorTmpValue \
  2327.           [expr [llength $colorTmpValue]-1] end]
  2328.  
  2329.     scan [string range $colorCurrentValue 1 2] "%x" colorBoxValue
  2330.     .colorBox.red set $colorBoxValue
  2331.     scan [string range $colorCurrentValue 3 4] "%x" colorBoxValue
  2332.     .colorBox.green set $colorBoxValue
  2333.     scan [string range $colorCurrentValue 5 6] "%x" colorBoxValue
  2334.     .colorBox.blue set $colorBoxValue
  2335.  
  2336.     .colorBox.current.current delete 0 end
  2337.     .colorBox.current.current insert 0 $colorCurrentColor
  2338.     ColorBoxSetColor $colorBoxMessage $colorBoxTargetW list $colorCurrentColor
  2339.     ColorBoxSetPaletteList $colorCurrentColor
  2340.   }
  2341. }
  2342.  
  2343. ##########
  2344. # Procedure: ColorBoxSetColor
  2345. # Description: set the new color
  2346. # Arguments: colorBoxMessage - the message for the color
  2347. #            colorBoxTargetW - the widget we configure
  2348. #            colorBoxType - who wants to set the demo area
  2349. #            colorBoxValue - the value to set
  2350. # Returns: none
  2351. # Sideeffects: none
  2352. ##########
  2353. proc ColorBoxSetColor {colorBoxMessage colorBoxTargetW colorBoxType colorBoxValue} {# xf ignore me 6
  2354.   global colorBox
  2355.  
  2356.   .colorBox.red config \
  2357.     -command "NoFunction"
  2358.   .colorBox.green config \
  2359.     -command "NoFunction"
  2360.   .colorBox.blue config \
  2361.     -command "NoFunction"
  2362.   .colorBox.h config \
  2363.     -command "NoFunction"
  2364.   .colorBox.s config \
  2365.     -command "NoFunction"
  2366.   .colorBox.v config \
  2367.     -command "NoFunction"
  2368.  
  2369.   set colorBoxSetColor ""
  2370.   if {"$colorBoxValue" != ""} {
  2371.     if {"$colorBoxType" != "text"} {
  2372.       .colorBox.current.current delete 0 end
  2373.       .colorBox.current.current insert 0 $colorBoxValue
  2374.     }
  2375.     if {[string match "*oreground*" $colorBoxMessage]} {
  2376.       catch ".colorBox.demo config -foreground $colorBoxValue"
  2377.     } {
  2378.       catch ".colorBox.demo config -background $colorBoxValue"
  2379.     }
  2380.     if {"$colorBoxTargetW" != ""} {
  2381.       catch "$colorBoxTargetW config -[string tolower $colorBoxMessage] \
  2382.         $colorBoxValue"
  2383.     }
  2384.   }
  2385.   case $colorBoxType in {
  2386.     {text palette} {
  2387.       if {[string match "*oreground*" $colorBoxMessage]} {
  2388.         set red [expr [lindex [winfo rgb .colorBox.demo [lindex [.colorBox.demo config -foreground] 4]] 0]/256]
  2389.         set green [expr [lindex [winfo rgb .colorBox.demo [lindex [.colorBox.demo config -foreground] 4]] 1]/256]
  2390.         set blue [expr [lindex [winfo rgb .colorBox.demo [lindex [.colorBox.demo config -foreground] 4]] 2]/256]
  2391.       } {
  2392.         set red [expr [lindex [winfo rgb .colorBox.demo [lindex [.colorBox.demo config -background] 4]] 0]/256]
  2393.         set green [expr [lindex [winfo rgb .colorBox.demo [lindex [.colorBox.demo config -background] 4]] 1]/256]
  2394.         set blue [expr [lindex [winfo rgb .colorBox.demo [lindex [.colorBox.demo config -background] 4]] 2]/256]
  2395.       }
  2396.       if {"$colorBox(type)" == "rgb"} {
  2397.         .colorBox.red set $red
  2398.         .colorBox.green set $green
  2399.         .colorBox.blue set $blue
  2400.       } {
  2401.         if {"$colorBox(type)" == "hsv"} {
  2402.           set colorBoxHSV [ColorBoxRGBToHSV [expr $red*256] [expr $green*256] [expr $blue*256]]
  2403.           .colorBox.h set [format %.0f [expr [lindex $colorBoxHSV 0]*1000.0]]
  2404.           .colorBox.s set [format %.0f [expr [lindex $colorBoxHSV 1]*1000.0]]
  2405.           .colorBox.v set [format %.0f [expr [lindex $colorBoxHSV 2]*1000.0]]
  2406.         }
  2407.       }
  2408.     }
  2409.   }
  2410.   .colorBox.red config \
  2411.     -command "ColorBoxSetRGBColor $colorBoxMessage \"$colorBoxTargetW\""
  2412.   .colorBox.green config \
  2413.     -command "ColorBoxSetRGBColor $colorBoxMessage \"$colorBoxTargetW\""
  2414.   .colorBox.blue config \
  2415.     -command "ColorBoxSetRGBColor $colorBoxMessage \"$colorBoxTargetW\""
  2416.   .colorBox.h config \
  2417.     -command "ColorBoxSetHSVColor $colorBoxMessage \"$colorBoxTargetW\""
  2418.   .colorBox.s config \
  2419.     -command "ColorBoxSetHSVColor $colorBoxMessage \"$colorBoxTargetW\""
  2420.   .colorBox.v config \
  2421.     -command "ColorBoxSetHSVColor $colorBoxMessage \"$colorBoxTargetW\""
  2422. }
  2423.  
  2424. ##########
  2425. # Procedure: ColorBoxSetRGBColor
  2426. # Description: set the color as RGB value
  2427. # Arguments: colorBoxMessage - the message for the color
  2428. #            colorBoxTargetW - the widget we configure
  2429. #            colorBoxValue - the passed value from scale
  2430. # Returns: none
  2431. # Sideeffects: none
  2432. ##########
  2433. proc ColorBoxSetRGBColor {colorBoxMessage colorBoxTargetW colorBoxValue} {# xf ignore me 6
  2434.   global colorBox
  2435.  
  2436.   ColorBoxSetColor $colorBoxMessage $colorBoxTargetW rgb \
  2437.     [format #%02x%02x%02x [.colorBox.red get] \
  2438.       [.colorBox.green get] [.colorBox.blue get]]
  2439.   ColorBoxSetPaletteList [format #%02x%02x%02x [.colorBox.red get] \
  2440.     [.colorBox.green get] [.colorBox.blue get]]
  2441. }
  2442.  
  2443. ##########
  2444. # Procedure: ColorBoxSetHSVColor
  2445. # Description: set the color as HSV value
  2446. # Arguments: colorBoxMessage - the message for the color
  2447. #            colorBoxTargetW - the widget we configure
  2448. #            colorBoxValue - the passed value from scale
  2449. # Returns: none
  2450. # Sideeffects: none
  2451. ##########
  2452. proc ColorBoxSetHSVColor {colorBoxMessage colorBoxTargetW colorBoxValue} {# xf ignore me 6
  2453.   global colorBox
  2454.  
  2455.   set colorBoxRGB [ColorBoxHSVToRGB [expr [.colorBox.h get]/1000.0] [expr [.colorBox.s get]/1000.0] [expr [.colorBox.v get]/1000.0]]
  2456.   ColorBoxSetColor $colorBoxMessage $colorBoxTargetW hsv \
  2457.     [format #%04x%04x%04x [lindex $colorBoxRGB 0] [lindex $colorBoxRGB 1] [lindex $colorBoxRGB 2]]
  2458.   ColorBoxSetPaletteList [format #%04x%04x%04x [lindex $colorBoxRGB 0] [lindex $colorBoxRGB 1] [lindex $colorBoxRGB 2]]
  2459. }
  2460.  
  2461. ##########
  2462. # Procedure: ColorBoxSetPalette
  2463. # Description: set the palette color
  2464. # Arguments: colorBoxMessage - the message for the color
  2465. #            colorBoxTargetW - the widget we configure
  2466. #            colorBoxElement - the palette element
  2467. # Returns: none
  2468. # Sideeffects: none
  2469. ##########
  2470. proc ColorBoxSetPalette {colorBoxMessage colorBoxTargetW colorBoxElement} {# xf ignore me 6
  2471.   global colorBox
  2472.  
  2473.   set colorBox(paletteNr) $colorBoxElement
  2474.   ColorBoxSetColor $colorBoxMessage $colorBoxTargetW palette \
  2475.     [lindex [.colorBox.palette.palette$colorBoxElement config -background] 4]
  2476. }
  2477.  
  2478. ##########
  2479. # Procedure: ColorBoxSetPaletteList
  2480. # Description: set the palette color list
  2481. # Arguments: colorBoxValue - the new palette value
  2482. # Returns: none
  2483. # Sideeffects: none
  2484. ##########
  2485. proc ColorBoxSetPaletteList {colorBoxValue} {# xf ignore me 6
  2486.   global colorBox
  2487.  
  2488.   catch ".colorBox.palette.palette$colorBox(paletteNr) config \
  2489.       -activebackground $colorBoxValue"
  2490.   catch ".colorBox.palette.palette$colorBox(paletteNr) config \
  2491.       -background $colorBoxValue"
  2492.   set colorBox(palette) \
  2493.     [lreplace $colorBox(palette) $colorBox(paletteNr) $colorBox(paletteNr) \
  2494.       $colorBoxValue]
  2495. }
  2496.  
  2497. ##########
  2498. # Procedure: ColorBoxShowSlides
  2499. # Description: select color for color composing
  2500. # Arguments: colorBoxMessage - the message for the color
  2501. #            colorBoxTargetW - the widget we configure
  2502. # Returns: none
  2503. # Sideeffects: none
  2504. ##########
  2505. proc ColorBoxShowSlides {colorBoxMessage colorBoxTargetW} {# xf ignore me 6
  2506.   global colorBox
  2507.  
  2508.   catch "pack unpack .colorBox.frame1"
  2509.   catch "pack unpack .colorBox.frame2"
  2510.   catch "pack unpack .colorBox.current"
  2511.   catch "pack unpack .colorBox.demo"
  2512.   catch "pack unpack .colorBox.h"
  2513.   catch "pack unpack .colorBox.s"
  2514.   catch "pack unpack .colorBox.v"
  2515.   catch "pack unpack .colorBox.red"
  2516.   catch "pack unpack .colorBox.green"
  2517.   catch "pack unpack .colorBox.blue"
  2518.   catch "pack unpack .colorBox.colors"
  2519.   case $colorBox(type) in {
  2520.     {rgb} {
  2521.       pack append .colorBox \
  2522.                   .colorBox.frame1 {bottom fillx} \
  2523.                   .colorBox.frame2 {bottom fillx} \
  2524.                   .colorBox.current {bottom fillx} \
  2525.                   .colorBox.palette {bottom fillx} \
  2526.                   .colorBox.red {top fillx} \
  2527.                   .colorBox.green {top fillx} \
  2528.                   .colorBox.blue {top fillx} \
  2529.                   .colorBox.demo {bottom fill expand}
  2530.     }
  2531.     {hsv} {
  2532.       pack append .colorBox \
  2533.                   .colorBox.frame1 {bottom fillx} \
  2534.                   .colorBox.frame2 {bottom fillx} \
  2535.                   .colorBox.current {bottom fillx} \
  2536.                   .colorBox.palette {bottom fillx} \
  2537.                   .colorBox.h {top fillx} \
  2538.                   .colorBox.s {top fillx} \
  2539.                   .colorBox.v {top fillx} \
  2540.                   .colorBox.demo {bottom fill expand}
  2541.     }
  2542.     {list} {
  2543.       pack append .colorBox \
  2544.                   .colorBox.frame1 {bottom fillx} \
  2545.                   .colorBox.frame2 {bottom fillx} \
  2546.                   .colorBox.current {bottom fillx} \
  2547.                   .colorBox.palette {bottom fillx} \
  2548.                   .colorBox.demo {bottom fillx} \
  2549.                   .colorBox.colors {top fill expand}
  2550.     }
  2551.   }
  2552.   if {[string match "*oreground*" $colorBoxMessage]} {
  2553.     ColorBoxSetColor $colorBoxMessage $colorBoxTargetW text \
  2554.       [lindex [.colorBox.demo config -foreground] 4]
  2555.   } {
  2556.     ColorBoxSetColor $colorBoxMessage $colorBoxTargetW text \
  2557.       [lindex [.colorBox.demo config -background] 4]
  2558.   }
  2559. }
  2560.  
  2561. ##########
  2562. # Procedure: ColorBoxHSVToRGB
  2563. # Description: modify hsv color values to rgb values
  2564. # Arguments: colorBoxHue - the hue
  2565. #            colorBoxSat - the saturation
  2566. #            colorBoxValue - the value
  2567. # Returns: none
  2568. # Sideeffects: none
  2569. ##########
  2570. proc ColorBoxHSVToRGB {colorBoxHue colorBoxSat colorBoxValue} {# xf ignore me 6
  2571. # The HSV <-> RGB converting routines are from the
  2572. # tcolor demo that is part of the demo site of Tk.
  2573.  
  2574.   set colorBoxV [format %.0f [expr 65535.0*$colorBoxValue]]
  2575.   if {$colorBoxSat == 0} {
  2576.     return "$colorBoxV $colorBoxV $colorBoxV"
  2577.   } else {
  2578.     set colorBoxHue [expr $colorBoxHue*6.0]
  2579.     if {$colorBoxHue >= 6.0} {
  2580.       set colorBoxHue 0.0
  2581.     }
  2582.     scan $colorBoxHue. %d i
  2583.     set colorBoxF [expr $colorBoxHue-$i]
  2584.     set colorBoxP [format %.0f [expr {65535.0*$colorBoxValue*(1 - $colorBoxSat)}]]
  2585.     set colorBoxQ [format %.0f [expr {65535.0*$colorBoxValue*(1 - ($colorBoxSat*$colorBoxF))}]]
  2586.     set colorBoxT [format %.0f [expr {65535.0*$colorBoxValue*(1 - ($colorBoxSat*(1 - $colorBoxF)))}]]
  2587.     case $i \
  2588.       0 {return "$colorBoxV $colorBoxT $colorBoxP"} \
  2589.       1 {return "$colorBoxQ $colorBoxV $colorBoxP"} \
  2590.       2 {return "$colorBoxP $colorBoxV $colorBoxT"} \
  2591.       3 {return "$colorBoxP $colorBoxQ $colorBoxV"} \
  2592.       4 {return "$colorBoxT $colorBoxP $colorBoxV"} \
  2593.       5 {return "$colorBoxV $colorBoxP $colorBoxQ"}
  2594.     error "i value $i is out of range"
  2595.   }
  2596. }
  2597.  
  2598. ##########
  2599. # Procedure: ColorBoxRGBToHSV
  2600. # Description: modify rgb color values to hsv values
  2601. # Arguments: colorBoxRed - the red value
  2602. #            colorBoxGreen - the green value
  2603. #            colorBoxBlue - the blue value
  2604. # Returns: none
  2605. # Sideeffects: none
  2606. ##########
  2607. proc ColorBoxRGBToHSV {colorBoxRed colorBoxGreen colorBoxBlue} {# xf ignore me 6
  2608. # The HSV <-> RGB converting routines are from the
  2609. # tcolor demo that is part of the demo site of Tk.
  2610.  
  2611.   if {$colorBoxRed > $colorBoxGreen} {
  2612.     set colorBoxMax $colorBoxRed.0
  2613.     set colorBoxMin $colorBoxGreen.0
  2614.   } else {
  2615.     set colorBoxMax $colorBoxGreen.0
  2616.     set colorBoxMin $colorBoxRed.0
  2617.   }
  2618.   if {$colorBoxBlue > $colorBoxMax} {
  2619.     set colorBoxMax $colorBoxBlue.0
  2620.   } else {
  2621.     if {$colorBoxBlue < $colorBoxMin} {
  2622.       set colorBoxMin $colorBoxBlue.0
  2623.     }
  2624.   }
  2625.   set range [expr $colorBoxMax-$colorBoxMin]
  2626.   if {$colorBoxMax == 0} {
  2627.     set colorBoxSat 0
  2628.   } else {
  2629.     set colorBoxSat [expr {($colorBoxMax-$colorBoxMin)/$colorBoxMax}]
  2630.   }
  2631.   if {$colorBoxSat == 0} {
  2632.     set colorBoxHue 0
  2633.   } else {
  2634.     set colorBoxRC [expr {($colorBoxMax - $colorBoxRed)/$range}]
  2635.     set colorBoxGC [expr {($colorBoxMax - $colorBoxGreen)/$range}]
  2636.     set colorBoxBC [expr {($colorBoxMax - $colorBoxBlue)/$range}]
  2637.     if {$colorBoxRed == $colorBoxMax} {
  2638.       set colorBoxHue [expr {.166667*($colorBoxBC - $colorBoxGC)}]
  2639.     } else {
  2640.       if {$colorBoxGreen == $colorBoxMax} {
  2641.         set colorBoxHue [expr {.166667*(2 + $colorBoxRC - $colorBoxBC)}]
  2642.       } else {
  2643.         set colorBoxHue [expr {.166667*(4 + $colorBoxGC - $colorBoxRC)}]
  2644.       }
  2645.     }
  2646.   }
  2647.   return [list $colorBoxHue $colorBoxSat [expr {$colorBoxMax/65535}]]
  2648. }
  2649.  
  2650. # eof
  2651. #
  2652.  
  2653.